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!