使用Matlab'找到'在仅沿第三维的3D逻辑阵列中

时间:2016-11-15 06:06:19

标签: matlab find

我有一个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

是否有一个数组操作允许我在没有循环的情况下进行操作?

1 个答案:

答案 0 :(得分:1)

不是一个非常直截了当的人。

这是因为在第三维度的任何地方都可能 <{1}}。

顺便说一句,你正在做的事情可能导致极其很难找到错误。如果某个地方没有真值,true将返回空矩阵(find)。并且,在MATLAB中为空格分配空矩阵将删除您要分配的数组中的元素。

意义:

  1. []将被删除
  2. B(ix,iy)中的元素数量将缩减1
  3. 所有后续结果将分配到B
  4. 中的错误位置
  5. 当你到达B的末尾(因此现在索引超出A的边界)时,MATLAB将自动增长数组B以适合你的作业。
  6. 你不会更聪明,但所有的结果都是毫无意义的垃圾。

    幸运的是,如果你在尺寸大于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倍,因此在正确记录时(可能将循环作为上面注释的一部分,以及随附的单元测试),那么,为什么不呢。