Matlab Vectorize

时间:2014-10-22 05:15:06

标签: matlab loops probability vectorization

我有一个大小为256x256x20的概率矩阵(glcm)。我把矩阵改成了 65536x20,这样我就可以消除一个循环(沿着第三维)。

我想进行以下计算。

for y = 1:256
    for x = 1:256
        if (ismember((x + y),(2:2*256))) 
            p_xplusy((x+y),:) = p_xplusy((x+y),:) + glcm(((y-1)*256+x),:);
        end
    end
end

所以p_xplusy将是一个511x20矩阵,每个元素是原始256x256x20矩阵的nxn子矩阵(其中n属于1:256)的对角线之和。

这个代码块使我的程序效率低下,我想对这个循环进行矢量化。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

由于您的if语句只是检查x+y是否小于或等于256,只需强制它始终为,并删除多余的循环:

for y = 1:256
    for x = 1:256-y
        p_xplusy((x+y),:) = p_xplusy((x+y),:) + glcm(((y-1)*256+x),:);
    end
end

这应该会为您的代码提供明显的加速。

答案 1 :(得分:0)

您可以将复杂性从O(n^2)降低到O(2*n),从而提高运行时效率 -

N = 256;
for k1 = 1:N
    idx_glcm = k1:N-1:N*(k1-1)+1;
    p_xplusy(k1+1,:) = p_xplusy(k1+1,:) + sum(glcm(idx_glcm,:),1);
end

for k1 = 2:N
    idx_glcm = k1*N:N-1:N*(N-1)+k1;
    p_xplusy(N+k1,:) = p_xplusy(N+k1,:) + sum(glcm(idx_glcm,:),1);
end

一些快速运行时测试似乎也证实了我们的效率理论。