这不是一个非常简单的问题。
那是因为可能没有be a true
沿三维空间的任意位置。
顺便说一下,你正在做的事情可能会导致极其很难找到错误。如果某处没有真正的价值,find
将返回空矩阵([]
)。并且,在 MATLAB 中将空矩阵分配给某些内容将delete您要分配给的数组中的该元素。
意义:
-
B(ix,iy)
将被删除
- 您的元素数量
B
将缩小 1
- 所有后续结果将被分配到错误的位置
B
- 当你到达终点时
A
(因此现在索引超出了边界B
), MATLAB会自动增长数组B
以适合您的任务。
你不会明白,但所有的结果都是毫无意义的垃圾。
幸运的是,如果您对维度大于 1 的数组执行此操作,MATLAB 会发出警告,BUT,如果您使用相同的技术vectors (e.g., B
是向量),MATLAB 不会警告您。
因此,至少要进行检查:
for ix = 1:x
for iy = 1:y
if any(A(ix,iy,:))
B(ix,iy) = find(A(ix,iy,:), 1, 'first');
end
end
end
另请注意any
可以采用第二个参数,将维度指定为“any
“结束了,意思是
any(A,3)
将返回一个x×y
逻辑数组,包含true
如果有一个true
in A
沿着它的第三维,并且false
否则。这可能会帮助您避免必须显式计算索引(通常,如果您更改范例,则并不真正明确需要它们)。
现在,说了这么多,你可以使用
[~, B] = max(A ~= 0, [], 3);
但你仍然需要对全零进行检查:
B(~any(A, 3)) = 0;
我想说,带有支票的循环只是so更直观的是它有我的偏好。但是,那max
技术大约快 7 倍,所以当正确记录时(可能将循环作为上面注释的一部分,以及附带的单元测试),那么,为什么不呢?