Assignment and indexing issue

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 ?..

 采纳的回答

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

1 个评论

Arf, I've mastered bsxfun but accumarray still eludes me... Thanks !

请先登录,再进行评论。

更多回答(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 个评论

What would be best between using sub2ind and accumarray (other answer) ?
Both are fine. Compare them for readability, your understanding of the code, speed of execution, translation into other languages, etc.
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 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