如何找到 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
让我们看看 I
和 J
:
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
我有一个 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
让我们看看 I
和 J
:
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