Azzera filtri
Azzera filtri

a simpler way of doing a nested loop

1 visualizzazione (ultimi 30 giorni)
Mnr
Mnr il 31 Ott 2015
Commentato: Stephen23 il 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.

Risposta accettata

Walter Roberson
Walter Roberson il 31 Ott 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 Commenti
Mnr
Mnr il 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 il 2 Nov 2015
Modificato: Stephen23 il 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);

Accedi per commentare.

Più risposte (1)

Jan
Jan il 31 Ott 2015
Modificato: Jan il 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 Commenti
Mnr
Mnr il 1 Nov 2015
Thank you so much!
Mnr
Mnr il 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.

Accedi per commentare.

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by