vector to struct without loop

3 visualizaciones (últimos 30 días)
Fernando
Fernando el 1 de En. de 2017
Comentada: Fernando el 2 de En. de 2017
I have two vectors, one with ids and another with information for each id. For each id, the vector with information has, potentially, a different number of entries. I want to assign this to a struct, ideally without using a loop as the information vector/struct is used within an optimization routine and it changes every time there is a new iteration.
This is the example:
id=[1 1 1 2 2 3]';
info = [0.5 1 10 1 0.3 -200]';
In this case, id 1 has three elements in the information vector, id 2 has two, and id 3 has one. With the loop, I would do
for i = 1:max(id),
m(i).info = info(id==i);
end
Is there anyway to do this without using the loop?
Thanks

Respuesta aceptada

Walter Roberson
Walter Roberson el 1 de En. de 2017
t1 = [find(diff(id).'), length(id)];
t2 = [t1(1), diff(t1)];
m = struct('info', mat2cell(info, t2, 1));
  2 comentarios
Fernando
Fernando el 1 de En. de 2017
This is great, thanks!
Matt J
Matt J el 1 de En. de 2017
Note, there are for-loops inside mat2cell.m.

Iniciar sesión para comentar.

Más respuestas (2)

Matt J
Matt J el 1 de En. de 2017
I'm not sure there's a fast way without loops, but here's a way that at least doesn't use any Mcoded for-loops as far as I know
n=max(id);
data=accumarray(id,info,[],@(x){x});
[m(1:n).info]=deal(data{:});
  1 comentario
Fernando
Fernando el 2 de En. de 2017
Thanks for the suggestion. In my application, with id going from 1 to ~30,000, this was slightly slower than the first approach, but both significantly faster than my Mcoded for-loop.

Iniciar sesión para comentar.


Fernando
Fernando el 2 de En. de 2017
Thanks for both suggestions, I have it working now.
Out of curiosity, how would I go the other way around? If I had the the information in structs of different dimensions for each id and I wanted to go from the structs to the vector info?
Thanks.
  2 comentarios
Matt J
Matt J el 2 de En. de 2017
info = vertcat(m.info);
Fernando
Fernando el 2 de En. de 2017
this is great, thanks.

Iniciar sesión para comentar.

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by