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

流过昼夜 提交于 2019-12-14 04:12:41

问题


I have a 3D matrix A, the size of which is 40*40*20 double. The values in 3D matrix is either "0" or "1". The number of "1" in matrix A is 50. I know how to find the corresponding coordinates of the 3D matrix. The code looks like this:

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

My question is how to just find the coordinates [xi yi zi] (i=1,2,...,50) of the nonzero elements in 3D matrix A, and then assign values a1, a2, a3, ..., a50 to the corresponding coordinates [xi yi zi] (i=1,2,...,50), also assign "NaN" values to the other coordinates with zero values?


回答1:


If you're trying to change the nonzero/zero values of a matrix, using logical indexing 1,2 you don't need find or ind2sub. @patrik gave the technique in the comments for changing the zero values to NaN:

A(A==0) = nan;

You can do the same thing for the nonzero values:

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

Note: You could replace A~=0 above with any of the following:

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



回答2:


OK. You already done half of this works. But , if you need some examples here is one: use ind2sub() function to create array with nonzero elements coordinates. I show the 2D example, because it's easy to visualize results:

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

lets take a look at I and 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

so now you can do anything with it. for example, set your values. If we have array of values a:

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

Similarly, you can go this way to create the array of zero elements and to set them Nan. And it works for 3D the same way.

P.S. by the way, I don't understand why you don't want to use just loops like this:

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


来源:https://stackoverflow.com/questions/32063240/how-to-find-the-coordinates-of-nonzero-elements-of-a-3-d-matrix

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!