我是MatLAB的新手,我不知道矢量化的正确基础知识。 我试图对这个函数进行矢量化。
function indc = PatchSearch(X, row, col, off, nv, S, I)
[N M] = size(I);
f2 = size(X,2);
rmin = max( row-S, 1 );
rmax = min( row+S, N );
cmin = max( col-S, 1 );
cmax = min( col+S, M );
idx = I(rmin:rmax, cmin:cmax);
idx = idx(:);
B = X(idx, :);
v = X(off, :);
dis = (B(:,1) - v(1)).^2;
for k = 2:f2
dis = dis + (B(:,k) - v(k)).^2;
end
dis = dis./f2;
[val,ind] = sort(dis);
indc = idx( ind(1:nv) );
%indc = idx(dis<250);
我需要一些专家的帮助来实现这个功能的矢量化 感谢
答案 0 :(得分:0)
您可以替换代码的以下循环部分 -
dis = (B(:,1) - v(1)).^2;
for k = 2:f2
dis = dis + (B(:,k) - v(k)).^2;
end
使用此bsxfun
实施 -
dis = sum(bsxfun(@minus,B,v).^2,2);
此假设f2
是B
中的列数,与v
中的元素数相同,并以{{1}的方式查看代码}和B
已初始化,似乎非常正确。
答案 1 :(得分:0)
使用repmat
和sum
的一种可能解决方案:
用此代码替换循环及其上方的行。
dis=sum((B-repmat(v,size(B,1),1)).^2,2);