我有一个大小为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)的对角线之和。
这个代码块使我的程序效率低下,我想对这个循环进行矢量化。任何帮助将不胜感激。
答案 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
一些快速运行时测试似乎也证实了我们的效率理论。