我有一个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"
值分配给零值的其他坐标?
答案 0 :(得分:2)
如果您尝试更改矩阵的非零值/零值,请使用逻辑索引1,2,您不需要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
让我们来看看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