Remove zeros from a 3D array
이전 댓글 표시
Hi,
I have a 3D array A = 90x38021x1633. The second dimension (38021) contains a lot of zeros as I have done zero padding before concatenating multiple 3D arrays to get A. How can I now remove these zeros such that B = 90xYx1633, where Y < 38021?
Thanks!
채택된 답변
추가 답변 (1개)
Nils Speetzen
2020년 2월 3일
Hi,
I assume you want to remove rows/planes containing only zeros. To find these, you can use
all(A==0, [1 3])
This searches for all planes where all entries along the first and third dimension are equal to zero.
To remove all those rows/planes, you can directly index A via this expression:
A(:,all(A==0, [1 3]),:) = []
I hope this helps!
댓글 수: 8
the cyclist
2020년 2월 3일
Uerm,
Note that Nils and my solutions are equivalent. I keep non-zeros, and he deletes zeros.
Just be careful that Nils' solution removes them from the original array A, which may be what you want, or maybe not.
Nils Speetzen
2020년 2월 3일
Hi,
i think the resulting matrix might not have any zero-planes. With how you describe it you pad the matrices along the second axis and concatenate along the third one:
M1 =
1 0 0 4
1 2 0 4
1 2 3 0
M2 =
1 2 0 0
1 0 0 0
1 2 3 0 (last column padded)
-> concatenated:
1 0 0 4
1 2 0 4
1 2 3 0
1 2 0 0
1 0 0 0
1 2 3 0
In my example i ignored the first dimension for simplification.
Uerm
2020년 2월 3일
the cyclist
2020년 2월 3일
편집: the cyclist
2020년 2월 3일
Question: What does is mean to "remove the zero" from the following matrix?
M = [1 0;
2 3];
You can't do it, because there is no such thing as an empty spot or gap in a matrix. (Specifically, in an array of type double in MATLAB.) Something has to be there. There is no such thing as
M = [1 ;
2 3];
as a matrix.
What are you trying to do with the result? Could you put a NaN there instead? Or use a cell array instead of a matrix?
Uerm
2020년 2월 3일
the cyclist
2020년 2월 3일
I'm not certain I fully understand, but I am getting some idea. Again, looking at just some small arrays as examples.
So maybe you had an array A1:
A1 = [1 2 0;
3 4 5];
where that zero was added for padding.
And you have another array A2:
A2 = [5 6 7;
8 9 0];
where that zero was also added for padding.
And you end up with A by concatenating A1 and A2 along the third dimension:
A = cat(3,A1,A2)
A(:,:,1) =
1 2 0
3 4 5
A(:,:,2) =
5 6 7
8 9 0
So A has some data where the zeros are not meaningful, and are just placeholders.
But, repeating my prior comment, you CANNOT just "remove" them. A matrix cannot have an "empty" spot.
You could do
A(A==0) = NaN
A(:,:,1) =
1 2 NaN
3 4 5
A(:,:,2) =
5 6 7
8 9 NaN
which replaces the zeros with NaN (not-a-number). You might then be able to do later steps in your calculation. Does that help?
Uerm
2020년 2월 10일
카테고리
도움말 센터 및 File Exchange에서 Logical에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!