Borrar filtros
Borrar filtros

Remove zero entries from cell arrays

14 visualizaciones (últimos 30 días)
Harold
Harold el 23 de Abr. de 2012
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
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 Creating and Concatenating Matrices en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by