a simpler way of doing a nested loop

2 Ansichten (letzte 30 Tage)
Mnr
Mnr am 31 Okt. 2015
Kommentiert: Stephen23 am 2 Nov. 2015
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.
  3 Kommentare
Mnr
Mnr am 1 Nov. 2015
Thanks.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 31 Okt. 2015
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 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
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