필터 지우기
필터 지우기

vector to struct without loop

조회 수: 3 (최근 30일)
Fernando
Fernando 2017년 1월 1일
댓글: Fernando 2017년 1월 2일
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

채택된 답변

Walter Roberson
Walter Roberson 2017년 1월 1일
t1 = [find(diff(id).'), length(id)];
t2 = [t1(1), diff(t1)];
m = struct('info', mat2cell(info, t2, 1));
  댓글 수: 2
Fernando
Fernando 2017년 1월 1일
This is great, thanks!
Matt J
Matt J 2017년 1월 1일
Note, there are for-loops inside mat2cell.m.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Matt J
Matt J 2017년 1월 1일
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
Fernando
Fernando 2017년 1월 2일
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.

댓글을 달려면 로그인하십시오.


Fernando
Fernando 2017년 1월 2일
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
Matt J
Matt J 2017년 1월 2일
info = vertcat(m.info);
Fernando
Fernando 2017년 1월 2일
this is great, thanks.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by