[英]How to speed-up this matlab loops
我希望你能在这里帮助我,我在matlab中遇到速度问题,代码如下:
%Example Definition
bf = 80;
sam = 10000;
dim = 300;
a = rand(bf, sam, dim);
T = rand(bf, sam, dim);
x = repmat(rand(1, sam, dim), [bf 1 1]);
%Calculation
E = zeros(size(T, ndims(T)));
dist = zeros(bf, sam);
a = repmat( a, [ 1 1 dim ]);
for i = 1:dim
for j = 1:dim
dist = x(:,:,j) .* T(:,:,i);
E(i,j) = sum(sum(a(:,:,i) .* (0.5 * dist), 2), 1);
end
end
这3个diminsional数组相当大(如80x10000x300),因此计算这个'E'矩阵的计算时间很长。 我已经尝试对它进行矢量化,但我不知道如何在不进入内存限制(16 GB)的情况下进行操作。
知道如何加快速度吗?
我不明白为什么它应该超过16GB。
您将每个像素存储为8B。 80 * 10K * 300 = 240M,因此每个矩阵接近2GB。 你有矩阵,总共8GB。
你的代码非常有效,减少内存使用的一个简单建议是使一切都single
; 即single(zeros(size(T)))
另一个建议是,如果您使用更多矩阵,请在完成后clear
变量。
另外,不要创建dist
变量,它只使用一次。
首先,使用i
和j
for循环会降低速度。 请参阅: 在Matlab中使用i和j作为变量
内存不足问题发生在a = repmat( a, [ 1 1 dim ]);
它扩展a
bf x sam x dim times。 但是,您访问a
的唯一地方是a(:,:,ii)
, ii
从1
变为dim
。 因此,在第三维中的300x300元素中,仅使用前300个元素。
一个可能的答案:你不需要repmat
并留下a
原样。
另一个可能的答案: a = repmat(rand(bf, sam, 1), [ 1 1 dim ]);
如果将3D矩阵重塑为2D矩阵,嵌套循环将转换为矩阵乘法:
x = reshape(x,[],dim).';
a = reshape(a,[],dim);
T = reshape(T,[],dim);
E = x * (a.*T*.5);
有时只是从以下更新嵌套循环
for i=1:m
for j=1:n
out(i,j) = something;
end
end
至
for j=1:n
for i=1:m
out(i,j) = something; %first rows fill
end
end
会显着改善性能:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.