如何找到三维矩阵的非零元素的坐标?

时间:2015-08-18 03:52:21

标签: matlab matrix matlab-deployment

我有一个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矩阵[xi yi zi] (i=1,2,...,50)中找到非零元素的坐标A,然后将值a1, a2, a3, ..., a50指定给相应的坐标[xi yi zi] (i=1,2,...,50),将"NaN"值分配给零值的其他坐标?

2 个答案:

答案 0 :(得分:2)

如果您尝试更改矩阵的非零值/零值,请使用逻辑索引12,您不需要find 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

答案 1 :(得分:0)

行。你已经完成了一半的工作。但是,如果你需要一些例子,这里有一个: 使用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