我有二进制图像,比方说512x512px。我想计算对相关g(x)。到目前为止,我一直在以无效的方式进行,一行一行:
function Cr = pairCorr(image)
domains = imread(image); % read image
domains(domains>0) = 1; % make sure its binary by setting 1 to values > 0
size = length(domains(:, 1)); % image size
for i=1:size
line = domains(:, i); % take one line...
for j=1:size % and for each distance...
s = line(1:end-size+j);
Cr(i, j) = mean(s); %...calculate Cr as mean
end
end
Cr = mean(Cr); % average all lines
知道怎么做得快一点吗? 谢谢!
答案 0 :(得分:1)
您的代码(来自循环)似乎与
相同Cr = mean(bsxfun(@rdivide, cumsum(domains), (1:n)'));
我的n
是您的size
。不要在matlab中使用size作为变量名,因为它是一个非常有用的函数。例如,你去了length(domains(:,1))
,但你可能已经离开了size(domains, 2)
我的代码在做什么:
cumsum(domains)
找到每列的累计总和。这就像为整个矩阵一次性地做for j=1:size s = line(1:end-size+j); Cr(i, j) = mean(s); end
。但是使用sum
代替mean
。因此,要将累积和的向量转换为均值,我们必须将每个元素除以列号。所以我们想要除以向量1:n。 bsxfun
允许我们对矩阵的每个维度切片执行操作。因此,在每列的2D情况下,它允许将(即@rdivide
)除以另一个常量列,即(1:n)'
。
这是一个显示等价的测试:
n = 512;
A = rand(n);
A(A > 0.5) = 1;
A(A <= 0.5) = 0
tic
Cr1 = mean(bsxfun(@rdivide, cumsum(A)', (1:n)));
toc
tic
for i=1:n
line = A(:, i);
for j=1:n
s = line(1:end-n+j);
Cr2(i, j) = mean(s);
end
end
Cr2 = mean(Cr2)
toc
mean(mean(Cr1 == Cr2))
结果:
Elapsed time is 0.016396 seconds.
Elapsed time is 75.2006 seconds.
所以虽然这只是1次运行,但它可以让你加速4500次,我认为非常好