【问题标题】:How to find the coordinates of nonzero elements of a 3-D matrix?如何找到 3-D 矩阵的非零元素的坐标?
【发布时间】:2015-08-18 03:52:20
【问题描述】:

我有一个 3D 矩阵 A,其大小是 40*40*20 double。 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"值分配给另一个坐标为零?

【问题讨论】:

  • 为什么要扣分?
  • 我没有投反对票,但这是因为你问的不是很清楚。请尝试给出您想要的数字示例...至少一个较小的数据集。
  • 看起来你已经解决了这个问题,使用 proposd 解决方案。你有 x.y.z- 索引。你还想要什么?此外,您可以使用A(A==0) = nan;

标签: matlab matrix matlab-deployment


【解决方案1】:

如果您尝试更改矩阵的非零/零值,使用逻辑索引1,2 您不需要find ind2sub@patrik 在 cmets 中给出了将零值更改为 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

【讨论】:

    【解决方案2】:

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

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

    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
    

    【讨论】:

    • 您通常远离循环的原因是因为它比较慢。 blogs.mathworks.com/loren/2008/06/25/… 。根据情况使用循环。在某些情况下,循环具有相当的速度,但通常它们较慢。在这种情况下,您绝对可以使用循环。因此,使用find 结合ind2sub 可能会比使用循环强化的示例更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2011-11-13
    • 2021-12-04
    相关资源
    最近更新 更多