Remove structs from an array of structs

12 visualizaciones (últimos 30 días)
Bartolomeo Ruotolo
Bartolomeo Ruotolo el 5 de Feb. de 2016
Editada: Guillaume el 5 de Feb. de 2016
I have a 1x1 struct A with 13 fields. One of these field, B, is a 15x1 cell, each cell is a 1x1 struct with 5 fields. How can I remove some of these structures contained in the cell with particular value in the field called 'name'? I've tried in this way:
for k = 1 : length(A.B) if A.B{k,1}.name = 'relax' A.B{k,1} = [] end end
The error is:
Error: File: xxx.m Line: 5 Column: 45 The expression to the left of the equals sign is not a valid target for an assignment.

Respuesta aceptada

Guillaume
Guillaume el 5 de Feb. de 2016
= is for assignment, == is for comparison. However, == does not work with strings, you use strcmp for that:
for cellidx = 1 : numel(A.B) %numel is a lot safer than length
if strcmp(A.B{cellidx}.name, 'relax')
A.B{cellidx} = [];
end
end
  2 comentarios
Bartolomeo Ruotolo
Bartolomeo Ruotolo el 5 de Feb. de 2016
Thank you very much, Sir. Now to remove the empty rows, can I use reshape?
Guillaume
Guillaume el 5 de Feb. de 2016
Editada: Guillaume el 5 de Feb. de 2016
reshape will never remove any element. If you wanted to get rid of the cells of B instead of filling them with empty, this is what you should have done:
for cellidx = 1 : numel(A.B) %numel is a lot safer than length
if strcmp(A.B{cellidx}.name, 'relax')
A.B(cellidx) = []; %note the use of () instead of {}
end
end
{} refers to the content of a cell, therefore when you do B{x} = []; you put empty in cell x.
() referes to the cell itself, therefore when you do B(x) = []; you remove the cell x itself.
If you've already set the cells content to empty, to delete those cells you'd do:
A.B(cellfun(@isempty, A.B)) = [];

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Structures 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