如何加速这个matlab循环

时间:2017-03-05 19:44:12

标签: matlab performance 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)。

知道如何加快速度吗?

4 个答案:

答案 0 :(得分:0)

我不明白为什么它应该超过16GB。

将每个像素存储为8B。 80 * 10K * 300 = 240M,因此每个矩阵接近2GB。你有矩阵,总共8GB。

您的代码非常高效,减少内存使用量的一个简单建议是使所有内容single;即single(zeros(size(T)))

另一个建议是,如果您在完成后使用更多矩阵,clear变量。

另外,不要创建dist变量,它只使用一次。

答案 1 :(得分:0)

首先,使用ij for循环会降低速度。看到: Using i and j as variables in Matlab

内存不足问题发生在a = repmat( a, [ 1 1 dim ]);中,它将a扩展为bf x sam x dim times。但是,您访问a的唯一位置是a(:,:,ii)ii1转到dim。因此,在第三维中的300x300元素中,仅使用前300个元素。

一个可能的答案:您不需要repmat并按原样离开a

另一个可能的答案:a = repmat(rand(bf, sam, 1), [ 1 1 dim ]);

答案 2 :(得分:0)

如果将3D矩阵重塑为2D矩阵,嵌套循环将转换为矩阵乘法:

x = reshape(x,[],dim).';
a = reshape(a,[],dim);
T = reshape(T,[],dim);
E = x * (a.*T*.5);

答案 3 :(得分:0)

有时只是从以下

更新嵌套循环
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

会显着改善效果: