필터 지우기
필터 지우기

a simpler way of doing a nested loop

조회 수: 1 (최근 30일)
Mnr
Mnr 2015년 10월 31일
댓글: Stephen23 2015년 11월 2일
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
Mnr
Mnr 2015년 11월 1일
Thanks.

댓글을 달려면 로그인하십시오.

채택된 답변

Walter Roberson
Walter Roberson 2015년 10월 31일
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
Mnr
Mnr 2015년 11월 1일
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 2015년 11월 2일
편집: Stephen23 2015년 11월 2일
@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);

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Jan
Jan 2015년 10월 31일
편집: Jan 2015년 11월 1일
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
Mnr
Mnr 2015년 11월 1일
Thank you so much!
Mnr
Mnr 2015년 11월 1일
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.

댓글을 달려면 로그인하십시오.

태그

Community Treasure Hunt

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

Start Hunting!

Translated by