【发布时间】:2012-05-25 17:36:19
【问题描述】:
这是我实现这个可爱公式的尝试。
http://dl.dropbox.com/u/7348856/Picture1.png
%WIGNER Computes Wigner-Distribution on an image (difference of two images).
function[wd] = wigner(difference)
%Image size
[M, N, ~] = size(difference);
%Window size (5 x 5)
Md = 5;
Nd = 5;
%Fourier Transform
F = fft2(difference);
%Initializing the wigner picture
wd = zeros(M, N, 'uint8');
lambda =0.02;
value = (4/(Md*Nd));
for x = 1+floor(Md/2):M - floor(Md/2)
for y = 1+floor(Nd/2):N - floor(Nd/2)
for l = -floor(Nd/2) : floor(Nd/2)
for k = -floor(Md/2) : floor(Md/2)
kernel = exp(-lambda * norm(k,l));
kernel = kernel * value;
theta = 4 * pi * ((real(F(x, y)) * (k/M) )+ (imag(F(x, y)) * (l/N)));
wd(x, y) = (wd(x, y)) + (cos(theta) * difference(x + k, y + l) * difference(x - k, y - l) * (kernel));
end
end
end
end
end
如您所见,外面的两个循环用于滑动窗口,而其余的内部循环用于求和的变量。
现在,亲爱的 stackoverflow 用户,我对您的请求是:您能帮我改进这些非常讨厌的 for 循环,这些循环花费的时间超过其份额,并将其变成矢量化循环吗? 这种改进会带来重大变化吗?
谢谢。
【问题讨论】:
-
我想你会看到
M和N的大值的改进。它们有多大? -
我可以告诉你矢量化肯定会提高计算速度。当 MATLAB 进行矢量数学运算时,它会一直向下传递到您 PC 的 BLAS 以进行优化。
-
@EitanT 图片尺寸为 320(N) x 240(M)。
-
我建议你看看this question。
-
@EitanT 我查看了您发布的链接。到目前为止,我将所有循环都转换为网格网格;但我遇到了规范函数的问题。我希望它使用矩阵的元素而不是整个矩阵,即 norm(K, L);其中 [L,K] = meshgrid(-floor(Nd/2):floor(Nd/2), -floor(Md/2):floor(Md/2));
标签: matlab optimization for-loop sum vectorization