0

I have a 1x10 structure array with plenty of fields and I would like to remove from the struct array the element with a specific value on one of the field variables. I know the value im looking for and the field I should be looking for and I also know how to delete the element from the struct array once I find it. Question is how(if possible) to elegantly identify it without going through a brute force solution ie a for-loop that goes through elements of the struct array to compare with the value I m looking for. Sample code: buyers as 1x10 struct array with fields: id,n,Budget and the variable to find in the id values like id_test = 12

Suever
  • 64,497
  • 14
  • 82
  • 101
Leon
  • 408
  • 1
  • 6
  • 17

1 Answers1

2

You can use the fact that if you have an array of structs, and you use the dot referencing, this creates a comma-separated list. If you enclose this in [] it will attempt to create an array and if you enclose it in {} it will be coerced into a cell array.

a(1).value = 1;
a(2).value = 2;
a(3).value = 3;

% Into an array
[a.value]

%   1   2   3

% Into a cell array
{a.value}

%   [1]     [2]     [3]

So to do your comparison, you can convert the field you care about into either an array of cell array to do the comparison. This comparison will then yield a logical array which you can use to index into the original structure.

For example

% Some example data
s = struct('id', {1, 2, 3}, 'n', {'a', 'b', 'c'}, 'Budget', {100, 200, 300});

% Remove all entries with id == 2
s = s([s.id] ~= 2);

% Remove entries that have an id of 2 or 3
s = s(~ismember([s.id], [2 3]));

% Find ones with an `n` of 'a' (uses a cell array since it's strings)
s = s(ismember({s.id}, 'a'));
Suever
  • 64,497
  • 14
  • 82
  • 101
  • This is exactly what I was looking for! A one-liner that not only identifies the element I need to remove through one of its fields but also removes it. Thanks! – Leon Jun 21 '16 at 09:21