我正在做一个从图像中提取信息的算法-这些信息中的大多数都是类似能量的数据这基本上是通过在图像中运行一个内核(大小作为参数给定)来完成的,并得到该内核中值的平方和。
这是在三个尺度上完成的,其中三个内核(补丁)大小是(此时):smallestPatchSize,smallestPatchSize*3,smallestPatchSize*9(在第二和第三种情况下有重叠的内核)这是针对几个颜色通道、渐变过滤器等(总共17个)完成的。
我的问题是是否有可能对下面的代码进行矢量化;很明显,这部分代码比其他代码需要更多的时间来运行我在Matlab中是一个初学者,仍然试图掌握矢量化的窍门,但这次比我强:)
for dim = 1:17
for i = 1:smallestPatchSize:(size(image,1) - currentPatchSize)
for j = 1:smallestPatchSize:(size(image,2) - currentPatchSize)
% calculate the position in the energy matrix
% which has different dimensions than the input pictures
iPosition = (i - 1 + smallestPatchSize) / smallestPatchSize;
jPosition = (j - 1 + smallestPatchSize) / smallestPatchSize;
% calculate the energy values and save them into the energy matrix
energy(iPosition, jPosition, dim) = sum(sum(abs(...
filters(i:i+currentPatchSize, j:j+currentPatchSize,dim)))) ^ 2;
end
end
end
提前谢谢-这是我的第一个问题@StackOverflow:)
最佳答案
你取的是块值的局部和和过滤器是可分离的,即如果要对m乘n求和,可以将其分解为先取m乘1和,然后取结果的1乘n和请注意,使用完全卷积时,求和的次数会多一点,但仍然比使用blkproc
或最近的blockproc
快。
因此,即使是smallestPatchSize
,也可以将内部循环编写为:
tmp = conv2(...
conv2(abs(filter),ones(currentPatchSize,1),'same'),...
ones(1,currentPatchSize,'same').^2;
%# tmp contains the energy for a sliding window filter.
energy = tmp((currentPatchSize/2+1):(currentPatchSize+1):size(image,1)-(currentPatchSize/2+1),...
(currentPatchSize/2+1):(currentPatchSize+1):size(image,2)-(currentPatchSize/2+1));