Remove zero entries from cell arrays

Suppose I have a m x n cell array. Some of these cells contain a 1 x 2 matrix of values other cells contain just a zero. I want to be able to delete all cells that contain zeros and have the cell array automatically re-size when finished. If you copy and past this in the command window you can see what I'm trying to accomplish. I've tried using ismember to look for the zeros but had no luck. I'm not very good when it comes to doing operations on cells. I need this to remain a cell array also. Thanks for any help.
points = {[-24.7697910000000,-15.8191235000000],0,[-12.6771670000000,20.4587480000000],0;0,[-20.6771670000000,-3.54125200000000],[-11.9803417500000,-14.5401785500000],0;0,[-20.6771670000000,-3.54125200000000],[4.32283300000000,-1.04125200000000],0;0,[13.0196582500000,-12.0401785500000],0,[-24.7697910000000,-15.8191235000000];[-11.9803417500000,-14.5401785500000],0,[4.32283300000000,-1.04125200000000],0;0,[-12.6771670000000,20.4587480000000],0,[13.0196582500000,-12.0401785500000];}

 Respuesta aceptada

Sean de Wolski
Sean de Wolski el 23 de Abr. de 2012
points = {[-24.7697910000000,-15.8191235000000],0,[-12.6771670000000,20.4587480000000],0;0,[-20.6771670000000,-3.54125200000000],[-11.9803417500000,-14.5401785500000],0;0,[-20.6771670000000,-3.54125200000000],[4.32283300000000,-1.04125200000000],0;0,[13.0196582500000,-12.0401785500000],0,[-24.7697910000000,-15.8191235000000];[-11.9803417500000,-14.5401785500000],0,[4.32283300000000,-1.04125200000000],0;0,[-12.6771670000000,20.4587480000000],0,[13.0196582500000,-12.0401785500000];}
p2 = num2cell(points,2);
C = cellfun(@(c)cellfun(@(x)x(x~=0),c,'uni',false),p2,'uni',false);
for ii = numel(C):-1:1
Cc = C{ii};
C(ii) = {Cc(cellfun(@(c)~isempty(c),Cc))};
end

Más respuestas (1)

Jan
Jan el 23 de Abr. de 2012
Another idea:
points = {[-24.7697910000000,-15.8191235000000],0, ...
[-12.6771670000000,20.4587480000000], 0; ...
0,[-20.6771670000000,-3.54125200000000], ...
[-11.9803417500000,-14.5401785500000],0; ...
0,[-20.6771670000000,-3.54125200000000], ...
[4.32283300000000,-1.04125200000000],0; ...
0,[13.0196582500000,-12.0401785500000],0, ...
[-24.7697910000000,-15.8191235000000]; ...
[-11.9803417500000,-14.5401785500000],0, ...
[4.32283300000000,-1.04125200000000],0; ...
0,[-12.6771670000000,20.4587480000000],0, ...
[13.0196582500000,-12.0401785500000]};
C = points(cellfun(@(x) ~isequal(x, 0), points));
"Automatically resize" is not unique: Should the number of rows or columns be adjusted?
C = reshape(C, size(points, 1), []); % For equal column length

5 comentarios

Sean de Wolski
Sean de Wolski el 23 de Abr. de 2012
I like this approach better
Harold
Harold el 23 de Abr. de 2012
Actually...I don't get the results exactly as I would like. I should get something like this. What should I change to fix this?
{[-24.7697910000000,-15.8191235000000],[-12.6771670000000,20.4587480000000];[-20.6771670000000,-3.54125200000000],[-11.9803417500000,-14.5401785500000];[-20.6771670000000,-3.54125200000000],[4.32283300000000,-1.04125200000000];[13.0196582500000,-12.0401785500000],[-24.7697910000000,-15.8191235000000];[-11.9803417500000,-14.5401785500000],[4.32283300000000,-1.04125200000000];[-12.6771670000000,20.4587480000000],[13.0196582500000,-12.0401785500000];}
Jan
Jan el 24 de Abr. de 2012
Perhaps: D = transpose(reshape(C, 4, []))
Harold
Harold el 25 de Abr. de 2012
This did not work. Order in each row is very important for what I need to do.
Jan
Jan el 25 de Abr. de 2012
Dear Harold, I'm sure you can solve this problem by your own using the commands TRANSPOSE, RESHAPE and/or PERMUTE. The main problem is solved by the CELLFUN call, and the finetuning is up to you.

Iniciar sesión para comentar.

Categorías

Más información sobre Matrices and Arrays en Centro de ayuda y File Exchange.

Preguntada:

el 23 de Abr. de 2012

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by