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

 Réponse acceptée

Walter Roberson
Walter Roberson le 24 Mai 2016

1 vote

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

1 commentaire

Marsellus Wallace
Marsellus Wallace le 24 Mai 2016
Arf, I've mastered bsxfun but accumarray still eludes me... Thanks !

Connectez-vous pour commenter.

Plus de réponses (1)

Jos (10584)
Jos (10584) le 24 Mai 2016

1 vote

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 commentaires

Marsellus Wallace
Marsellus Wallace le 24 Mai 2016
Modifié(e) : Marsellus Wallace le 24 Mai 2016
What would be best between using sub2ind and accumarray (other answer) ?
Jos (10584)
Jos (10584) le 24 Mai 2016
Both are fine. Compare them for readability, your understanding of the code, speed of execution, translation into other languages, etc.
Marsellus Wallace
Marsellus Wallace le 24 Mai 2016
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 !

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by