我有一个3D逻辑阵列,例如:
A = randi([0 1],x,y,z);
其中x,y,z是整数。
对于每个(x,y),有没有办法在第三维' z'中找到第一个真值?
我可以在这样的循环中完成:
B = zeros(x,y);
for ix = 1:x
for iy = 1:y
B(ix,iy) = find(A(ix,iy,:),1,'first');
end
end
是否有一个数组操作允许我在没有循环的情况下进行操作?
答案 0 :(得分:1)
不是一个非常直截了当的人。
这是因为在第三维度的任何地方都可能 <{1}}。
顺便说一句,你正在做的事情可能导致极其很难找到错误。如果某个地方没有真值,true
将返回空矩阵(find
)。并且,在MATLAB中为空格分配空矩阵将删除您要分配的数组中的元素。
意义:
[]
将被删除B(ix,iy)
中的元素数量将缩减1 B
B
的末尾(因此现在索引超出A
的边界)时,MATLAB将自动增长数组B
以适合你的作业。 你不会更聪明,但所有的结果都是毫无意义的垃圾。
幸运的是,如果你在尺寸大于1, 但 的数组上这样做,那么MATLAB会发出警告,如果你在向量(例如,B
是一个向量),MATLAB不会警告你。
所以,至少,请检查一下:
B
另请注意,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)
逻辑数组,如果{3}中的x×y
沿其第三维存在true
,则返回true
。这可以帮助您防止必须明确地计算索引(通常,如果您更改范例,它们并非真正明确需要)。
现在,说了这么多,你可以使用
A
但你仍然需要对全零进行检查:
false
我会说,带有支票的循环只是所以更直观,它有我的偏好。但是,[~, B] = max(A ~= 0, [], 3);
技术的速度提高了大约7倍,因此在正确记录时(可能将循环作为上面注释的一部分,以及随附的单元测试),那么,为什么不呢。