如何找到 3-D 矩阵的非零元素的坐标?

How to find the coordinates of nonzero elements of a 3-D matrix?

我有一个 3D 矩阵 A,它的大小是 40*40*20 的两倍。 3D 矩阵中的值是 "0""1"。矩阵A中"1"的个数是50,我知道如何找到3D矩阵对应的坐标。代码如下所示:

[x y z] = ind2sub(size(A),find(A));
coords = [x y z];

我的问题是如何只找到3D矩阵A中非零元素的坐标[xi yi zi] (i=1,2,...,50),然后将值a1, a2, a3, ..., a50赋值给对应的坐标[xi yi zi] (i=1,2,...,50) , 也将 "NaN" 值分配给其他具有零值的坐标?

好的。你已经完成了一半的工作。但是,如果你需要一些例子,这里有一个: 使用 ind2sub() 函数创建具有非零元素坐标的数组。我展示了 2D 示例,因为它很容易可视化结果:

k = 0;
for i = 1:size(A,1)*size(A,2)
    if A(i) == 1
        [ I(k+1) J(k+1)] = ind2sub(s,i);
        k=k+1;
    end
end

让我们看看 IJ:

A =

 1     0     0     0     1
 1     0     1     0     0
 0     1     1     1     1
 1     1     0     1     1
 1     1     1     1     1
I = 1     2     4     5     3     4     5     2     3     5     3     4     5     1     3     4     5
J = 1     1     1     1     2     2     2     3     3     3     4     4     4     5     5     5     5

所以现在您可以用它做任何事情。例如,设置您的价值观。如果我们有值数组 a:

for k = 1:size(I,2)
A(I(k),J(k)) = a(k);
end

同样,您可以通过这种方式创建零元素数组并设置它们Nan。它以同样的方式适用于 3D。

P.S。顺便说一句,我不明白你为什么不想只使用这样的循环:

for i: = 1:40
    for j = 1:40
        for k = 1:20
        if A(i,j,k) == 1
            A(i,j,k) = a(l);
            l = l + 1;
        else A(i,j,k) = NaN;
        l = l + 1;
        end
    end
end

如果您尝试更改矩阵的 nonzero/zero 值,使用逻辑索引 1,2 you don't need find or ind2sub. @patrik 在评论中给出了将零值更改为 NaN 的技术:

A(A==0) = nan;

您可以对非零值执行相同的操作:

A(A~=0) = a(1:sum(A~=0));

注意:您可以将上面的 A~=0 替换为以下任何一项:

~~A
A>0         %// IFF you have no negative values
find(A)     %// but the logical operations are faster