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

 Accepted Answer

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

1 Comment

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

Sign in to comment.

More Answers (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 Comments

Marsellus Wallace
Marsellus Wallace on 24 May 2016
Edited: Marsellus Wallace on 24 May 2016
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 !

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!