Remove my for loop using meshgrid?

조회 수: 3 (최근 30일)
Manne Plok
Manne Plok 2018년 9월 4일
댓글: Walter Roberson 2018년 9월 5일
[rows, ~, ~] = size(file)
for i = 1:rows
value = min(abs(file(i,:,1) - shadow(:,:,1)).^2);
storage(i,:) = value;
How do i avoid the for loop in this scenario?
  댓글 수: 9
Walter Roberson
Walter Roberson 2018년 9월 5일
For real values,
min(abs(file(i,:,1) - shadow(:,:,1)).^2)
is the same as
min(abs(file(i,:,1) - shadow(:,:,1))).^2
but the later is more efficient since it only needs to square a single value.
Let's see... 1 x n x 1 minus a x 1 x 1 is an error in R2016a and earlier. In R2016b and later, it will give an a x n result. abs() of that would be a x n. squaring that would be a x n. min() of that would be 1 x n. And that would be acceptable to store into 1 x n in the next row.
To confirm: you want to find the square of the closest distance that exists between each value in file(i,:,1) and all of the values in shadow(:,:,1) ?
Manne Plok
Manne Plok 2018년 9월 5일
Yes that is exactly right.

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

답변 (1개)

Greg 2018년 9월 5일
편집: Greg 2018년 9월 5일
Given the following code, why are file and shadow 3D? Have we left off an outer loop over dim 3?
[rows, ~, ~] = size(file)
%%%I really don't like "i" as loop index
for irow = 1:rows
value = min(abs(file(irow,:,1) - shadow(:,:,1)).^2);
storage(irow,:) = value;
To take advantage of any tricks to avoid the loop, you need another dimension in your data. Note, this requires potentially excessive memory for any speedup you might gain. Assuming you want to do the same thing across the third dimension, try:
shadow = permute(shadow,[4,2,3,1]);
%%%Implicit expansion *will do* multiple singleton dimensions
delta = file - shadow; % R2016b+
% delta = bsxfun(@minus,file,shadow); % R2016a-
storage = min(abs(delta),[],4).^2;
If the third dimension is handled differently, you can use:
shadow_temp = permute(shadow(:,:,1),[2,3,1]);
delta = file - shadow_temp; % R2016b+
% delta = bsxfun(@minus,file,shadow_temp); % R2016a-
storage = min(abs(delta),[],3).^2;
I leave you with 2 thoughts:
  1. Other MVPs encourage the use of bsxfun even in R2016b+. I've never benchmarked it but I trust them when they say it is faster. I personally use implicit expansion for readability. I aim for fast enough code that is easier to read and write versus fastest possible code that coworkers may struggle with.
  2. Depending on your data, you may not need both the abs and .^2. Likely, the squaring accomplishes what you want the abs for, so kill the abs and suck the square inside the min call.
  댓글 수: 1
Walter Roberson
Walter Roberson 2018년 9월 5일
More recent tests are not as clear about the relative speeds of bsxfun and implicit expansion. Implicit expansion might possibly be a hair faster in some cases, but the margin of error in the measurements far exceeded the difference in timings.

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


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