vector to struct without loop

3 visualizzazioni (ultimi 30 giorni)
Fernando
Fernando il 1 Gen 2017
Commentato: Fernando il 2 Gen 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

Risposta accettata

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

Accedi per commentare.

Più risposte (2)

Matt J
Matt J il 1 Gen 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 Commento
Fernando
Fernando il 2 Gen 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.

Accedi per commentare.


Fernando
Fernando il 2 Gen 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 Commenti
Matt J
Matt J il 2 Gen 2017
info = vertcat(m.info);
Fernando
Fernando il 2 Gen 2017
this is great, thanks.

Accedi per commentare.

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by