这里没有添加太多,但也许这会让您更好地理解,因此值得添加另一个解决方案。
% example data
A = randi( 255, [2,4,3] ); A(2,2,:) = [0,0,0];
B = randi( 255, [2,4,3] );
% Logical array with size [Dim1, Dim2], such that Dim3 is 'squashed' into a
% single logical value at each position, indicating whether the third dimension
% at that position does 'not' have 'any' true (i.e. nonzero) values.
I = ~any(A, 3);
% Use this to index A and B for assignment.
A([I,I,I]) = B([I,I,I])
这种方法可能比 repmat 更有效,repmat 是一种稍微昂贵的操作,但可能不太明显理解它的工作原理。 但是。了解它的工作原理会教你一些关于 matlab/octave 的知识,所以这是一个很好的学习点。
Matlab 和 Octave 将数组存储在 column major order 中(与 Python 相对)。这也是执行A(:) 将返回A 作为向量的原因,该向量逐列构造。这也是您可以使用单个索引(称为“线性索引”)对 3 维数组进行索引的原因,该索引将对应于您在计算沿列的元素数量时到达的元素。
执行逻辑索引时,matlab/octave 有效地获取一个逻辑向量,将该向量的每个线性索引与A 的等效线性索引匹配,并根据是否返回它的布尔值来决定是否返回它。该线性索引处的逻辑索引是真还是假。如果您提供的逻辑数组I 的大小小于A,则索引将简单地停止在I 的最后一个线性索引处。具体来说,请注意I 的 shape 无关紧要,因为无论如何它都会以线性索引方式进行解释。
换句话说,使用I 的逻辑索引与使用I(:) 的逻辑索引相同,使用[I,I,I] 的逻辑索引与使用[ I(:); I(:); I(:) ] 的逻辑索引相同。
如果I 的大小为A(:,:,1),则[I,I,I] 的大小为A(:,:,:),因此在线性索引意义上,它可以用作匹配I 的每个线性索引的有效逻辑索引A 的等效线性索引。