1

我有一个二进制图像,比如说 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

知道如何更快地做到这一点吗?谢谢!

4

1 回答 1

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 的加速,我认为这非常好

于 2013-02-22T09:50:32.507 回答