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

 Risposta accettata

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

1 Commento

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

Accedi per commentare.

Più risposte (1)

Jos (10584)
Jos (10584) il 24 Mag 2016
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 Commenti

Marsellus Wallace
Marsellus Wallace il 24 Mag 2016
Modificato: Marsellus Wallace il 24 Mag 2016
What would be best between using sub2ind and accumarray (other answer) ?
Jos (10584)
Jos (10584) il 24 Mag 2016
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 !

Accedi per commentare.

Categorie

Scopri di più su Loops and Conditional Statements in Centro assistenza e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by