I have some data and their indexed coordinates in an array x :
% x(q,:) == [jq,iq,kq,xq]
I have an empty 3D matrix d in which I want to store these data, like so :
d = Inf(m,n,p);
for i=1:length(x)
d(x(i,2),x(i,1),x(i,3)) = x(i,4);
end
My question is, is there any way to do it without a loop ? I was thinking something like this but it does not work :
d = Inf(m,n,p);
d(x(:,[2,1,3])) = x(:,4);
Maybe throw a sub2ind or something in there somewhere ?..

 採用された回答

Walter Roberson
Walter Roberson 2016 年 5 月 24 日

1 投票

d = accumarray(x(:,[2 1 3]), x(:,4), [m, n, p]);

1 件のコメント

Marsellus Wallace
Marsellus Wallace 2016 年 5 月 24 日
Arf, I've mastered bsxfun but accumarray still eludes me... Thanks !

サインインしてコメントする。

その他の回答 (1 件)

Jos (10584)
Jos (10584) 2016 年 5 月 24 日

1 投票

x = [1 1 1 10 ; 1 1 2 20 ; 2 3 2 30] % data
sz = max(x(:,1:3),[],1)
d = Inf(sz)
idx = sub2ind(sz,x(:,1),x(:,2),x(:,3))
d(idx) = x(:,4)

3 件のコメント

Marsellus Wallace
Marsellus Wallace 2016 年 5 月 24 日
編集済み: Marsellus Wallace 2016 年 5 月 24 日
What would be best between using sub2ind and accumarray (other answer) ?
Jos (10584)
Jos (10584) 2016 年 5 月 24 日
Both are fine. Compare them for readability, your understanding of the code, speed of execution, translation into other languages, etc.
Marsellus Wallace
Marsellus Wallace 2016 年 5 月 24 日
Well, I prefer sub2ind for readability but accumarray for conciseness. I'll test tomorrow for speed of execution but it was pretty quick already even with the loop, so...
Anyway, thanks !

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by