我正在尝试提高此代码的速度,但我无法理解如何在这里使用矢量化(而不是for-loop)。该功能来自我使用SAD template matching的{{3}}。{/ p>
function [diffs,time] = search(template,image)
[hT,wT] = size(template);
[hI,wI] = size(image);
h = hI-hT+1;
w = wI-wT+1;
diffs = zeros(h,w);
tic;
for i = 1:h
for j = 1:w
t = image(i:i+hT-1,j:j+wT-1)-template(:,:); % ???
diffs(i,j) = sum(sum(abs(t)));
end
end
time = toc;
对于640x480的图像,此功能大约需要22-25秒。
答案 0 :(得分:1)
如果您的模板尺寸为480 * 360且图像尺寸为640 * 480,则总共需要执行480 * 360 * 480 * 640 = 5.3084e +10次操作。
所以,我认为你的速度不会超过22-25秒。
在你的情况下,循环中的代码非常大并且是矢量化的,所以你不会通过分解获得太多。
如果您的模板小得多,可以使用函数im2col
进行矢量化,但由于模板非常大,因此需要太多RAM内存。
答案 1 :(得分:1)
您想要使用图片上的im2col
功能和repmat
初始模板。
im_v = im2col(image,[hT wT]);
template_v = repmat(template(:),1,size(im_v,2));
im_v
将存储矩阵的每个hT x wT
块的列向量。现在,您可以执行im_v
和template_v
之间的任何功能。