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

 Respuesta aceptada

Walter Roberson
Walter Roberson el 24 de Mayo de 2016
d = accumarray(x(:,[2 1 3]), x(:,4), [m, n, p]);

1 comentario

Marsellus Wallace
Marsellus Wallace el 24 de Mayo de 2016
Arf, I've mastered bsxfun but accumarray still eludes me... Thanks !

Iniciar sesión para comentar.

Más respuestas (1)

Jos (10584)
Jos (10584) el 24 de Mayo de 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 comentarios

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

Iniciar sesión para comentar.

Categorías

Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by