Avoiding unnecessary for loops

조회 수: 1 (최근 30일)
Deepayan Bhadra
Deepayan Bhadra 2018년 3월 6일
편집: Jan 2018년 3월 8일
How do I do this without the loops in a few lines?
S = zeros(100,100);
sig = 0.05;
for i = 1:100
for j = 1:100
S(i,j) = exp(-norm(D(i,:)-D(j,:),'fro')/sig);
end
end
  댓글 수: 2
Deepayan Bhadra
Deepayan Bhadra 2018년 3월 7일
@Walter Roberson, did you make any comment on this?
Jos (10584)
Jos (10584) 2018년 3월 7일
Note that S will be symmetric with zeros on the diagonal, as norm(x) = norm(-x), so you can let j run from i+1 to 100 to save time.
Since norm is not vectorized it is hard to get rid of the for-loops at all.

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

채택된 답변

Jan
Jan 2018년 3월 7일
편집: Jan 2018년 3월 7일
These are a few lines already. The mos expensive is the exp call, so you save the most time with using the symmetry (as mentioned by Jos already):
S = zeros(100,100);
sig = 0.05;
for i = 1:100
for j = i+1:100
S(i,j) = exp(-norm(D(i,:) - D(j,:)) / sig);
S(j,i) = S(i,j);
end
end
You can try if it is faster to replace norm by:
for i = 1:100
v = D(i, :);
for j = i+1:100
w = v - D(j, :);
S(i,j) = exp(-sqrt(w * w.') / sig);
S(j,i) = S(i,j);
end
end
Operating on columns is faster than on rows:
DT = D.';
for i = 1:100
v = DT(:, i);
for j = i+1:100
w = v - DT(:, j);
S(i,j) = exp(-sqrt(w.' * w) / sig);
S(j,i) = S(i,j);
end
end
Please post the timings you get.
  댓글 수: 4
Deepayan Bhadra
Deepayan Bhadra 2018년 3월 8일
data: 100x2. D = pdist(data), Z = squareform(D), S = exp(-Z/sig). This accomplishes the exact thing as the for loop. I appreciate your inputs but let's not jump to conclusions about intentions of different MATLAB users on the forum.
Jan
Jan 2018년 3월 8일
편집: Jan 2018년 3월 8일
In pdist you find exactly the same loops as in the suggested code, but S = exp(-Z/sig) does not use the symmetry of the input, such that almost the double number of expensive exp() calls are performed. Therefore I assume, that this "loop free" code is not less "nightmarishly time-consuming". I'm interested in the timings you get, especially for the larger matrices with 10'000 vectors.
I did not draw any conclusions about intentions of anybody. I'm convinced, that the forum should not solve homework. That's all. But discussions about homework are very useful for the forum and the students.

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by