Remove zeros from a 3D array
Afficher commentaires plus anciens
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!
Réponse acceptée
Plus de réponses (1)
Nils Speetzen
le 3 Fév 2020
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 commentaires
the cyclist
le 3 Fév 2020
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
le 3 Fév 2020
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
le 3 Fév 2020
the cyclist
le 3 Fév 2020
Modifié(e) : the cyclist
le 3 Fév 2020
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
le 3 Fév 2020
the cyclist
le 3 Fév 2020
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
le 10 Fév 2020
Catégories
En savoir plus sur Logical dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!