簡體   English   中英

如何加速這個matlab循環

[英]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變量,它只使用一次。

首先,使用ij for循環會降低速度。 請參閱: 在Matlab中使用i和j作為變量

內存不足問題發生在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 ]);

如果將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM