a simpler way of doing a nested loop

Hello,
Is there a more efficient alternative way that does the same function as:
V=[1+1i +1-1i -1+1i -1-1i];
for m1=1:length(V)
a=V(m1);
for m2=1:length(V)
b=V(m2);
for m3=1:length(V)
c=V(m3);
for m4=1:length(V)
d=V(m4);
h=[.3 .2]*[a b].'+[.5 .8]*[c d].';
h1(m1,m2,m3,m4)=h;
end
end
end
end
Thanks.

 Akzeptierte Antwort

Walter Roberson
Walter Roberson am 31 Okt. 2015

3 Stimmen

V=[1+1i +1-1i -1+1i -1-1i];
[A,B,C,D] = ndgrid(V);
h1 = 0.3*A + 0.2*B + 0.5*C + 0.8*D;

5 Kommentare

Mnr
Mnr am 31 Okt. 2015
Thank you, but does not give the same answer.
Walter Roberson
Walter Roberson am 31 Okt. 2015
I just tried it and it gives an exact identical answer, not a single bit difference.
Mnr
Mnr am 31 Okt. 2015
oh sorry. I did not clear the memory. Thank you for your help.
Mnr
Mnr am 1 Nov. 2015
Is there is a way of writing this code in a more general form such that it works for different sizes of V? Thank you.
Stephen23
Stephen23 am 2 Nov. 2015
Bearbeitet: Stephen23 am 2 Nov. 2015
@Mnr: try this:
V = [1+1i,+1-1i,-1+1i,-1-1i];
W = [0.3,0.2,0.5,0.8];
N = numel(V);
X = cell(1,N);
[X{:}] = ndgrid(V);
Y = cat(N+1,X{:});
S = [ones(1,N),N];
Z = sum(bsxfun(@times,reshape(W,S),Y),N+1);

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Jan
Jan am 31 Okt. 2015
Bearbeitet: Jan am 1 Nov. 2015

3 Stimmen

I prefer Walter's solution, because it is nice. But it is worth to mention, that a pre-allocation improves the loop version. Replacing the dot-product by direct algebra and avoiding repeated calculations improves the speed also:
V = [1+1i, 1-1i, -1+1i, -1-1i];
n = length(V);
h1 = zeros(n, n, n, n);
for m1 = 1:n
c = 0.3 * V(m1);
for m2 = 1:n
c = c + 0.2 * V(m2);
for m3 = 1:n
c = c + 0.5 * V(m3);
for m4 = 1:n
h1(m1,m2,m3,m4) = c + 0.8 * V(m4);
end
end
end
end
Timings for 5000 repetitions, Matlab R2011b/64/Win7:
Original: 8.90 sec
Walters ndgrid: 1.47 sec
Loop, pre-allocation, inlined dot products: 0.34 sec

2 Kommentare

Mnr
Mnr am 1 Nov. 2015
Thank you so much!
Mnr
Mnr am 1 Nov. 2015
Is there is a way of writing this code in a more general form such that it works for different sizes of V? Thank you.

Melden Sie sich an, um zu kommentieren.

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by