向量化 MATLAB 循环
Vectorize MATLAB loop
我有以下 MATLAB 代码:
meanv = [rmean,gmean,bmean];
for i = 1:1:image_info.Height
for j = 1:1:image_info.Width % for every pixel
x = image_rgb(i,j,1:3);
pix_color = [x(:,:,1),x(:,:,2),x(:,:,3)];
d = dist(meanv,pix_color');
if d <= threshold
S(i,j) = 1;
end
end
end
以上片段是一个程序的一部分,该程序从 RGB 图像中根据用户标记的几个点分割对象或颜色。分割是通过欧几里德距离到用户标记的点的平均值来实现的。对于每个像素,如果距离小于给定阈值,则该像素在分割图像中为白色。否则,黑色。
代码运行良好,但有点慢。我如何利用 MATLAB 使用向量和矩阵比使用循环快得多这一事实?
也就是说,这段代码如何向量化?
方法 #1 使用 bsxfun
-
%// Get image size
[m,n,r] = size(image_rgb)
%// Calculate squared distances
M = sum(bsxfun(@minus,reshape(image_rgb,[],3),meanv).^2,2)
%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M <= threshold^2 ,m,n)
方法 #2 使用 matrix-multiplication based euclidean distance calculations
-
%// Get image size
[m,n,r] = size(image_rgb)
%// Calculate squared distances
A = reshape(image_rgb,[],3);
Bt = meanv(:);
M = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt]
%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M<= threshold^2,m,n)
快速运行时测试:运行随机512 x 512 x 3
图像上的代码:image_rgb = randi(255,512,512,3)
,运行时为-
---------------------------------- With Original Approach
Elapsed time is 5.850163 seconds.
---------------------------------- With BSXFUN
Elapsed time is 0.006737 seconds.
-------------------------- With Matrix-multiplication based Eucl. dist
Elapsed time is 0.015704 seconds.
更多选择 vectorization
的理由!
我有以下 MATLAB 代码:
meanv = [rmean,gmean,bmean];
for i = 1:1:image_info.Height
for j = 1:1:image_info.Width % for every pixel
x = image_rgb(i,j,1:3);
pix_color = [x(:,:,1),x(:,:,2),x(:,:,3)];
d = dist(meanv,pix_color');
if d <= threshold
S(i,j) = 1;
end
end
end
以上片段是一个程序的一部分,该程序从 RGB 图像中根据用户标记的几个点分割对象或颜色。分割是通过欧几里德距离到用户标记的点的平均值来实现的。对于每个像素,如果距离小于给定阈值,则该像素在分割图像中为白色。否则,黑色。
代码运行良好,但有点慢。我如何利用 MATLAB 使用向量和矩阵比使用循环快得多这一事实? 也就是说,这段代码如何向量化?
方法 #1 使用 bsxfun
-
%// Get image size
[m,n,r] = size(image_rgb)
%// Calculate squared distances
M = sum(bsxfun(@minus,reshape(image_rgb,[],3),meanv).^2,2)
%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M <= threshold^2 ,m,n)
方法 #2 使用 matrix-multiplication based euclidean distance calculations
-
%// Get image size
[m,n,r] = size(image_rgb)
%// Calculate squared distances
A = reshape(image_rgb,[],3);
Bt = meanv(:);
M = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt]
%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M<= threshold^2,m,n)
快速运行时测试:运行随机512 x 512 x 3
图像上的代码:image_rgb = randi(255,512,512,3)
,运行时为-
---------------------------------- With Original Approach
Elapsed time is 5.850163 seconds.
---------------------------------- With BSXFUN
Elapsed time is 0.006737 seconds.
-------------------------- With Matrix-multiplication based Eucl. dist
Elapsed time is 0.015704 seconds.
更多选择 vectorization
的理由!