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

 Akzeptierte Antwort

Walter Roberson
Walter Roberson am 24 Mai 2016

1 Stimme

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

1 Kommentar

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Jos (10584)
Jos (10584) am 24 Mai 2016

1 Stimme

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 Kommentare

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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by