簡體   English   中英

如何在Matlab中加速雙循環

[英]How to speed up a double loop in matlab

這是該問題的后續問題

以下代碼需要花費大量時間來遍歷。 您對加快流程有什么建議嗎? 變量z的大小為479x1672,其他大小約為479x12000。

z = HongKongPrices;

 zmat = false(size(z));

 r = size(z,1);
 c = size(z,2);

 for k = 1:c
    for i = 5:r
        if z(i,k) == z(i-4,k) && z(i,k) == z(i-3,k) && z(i,k) == z(end,k)
            zmat(i-3:i,k) = 1 
        end
    end
 end

z(zmat) = NaN

我目前正在具有3.2 Intel i5和16 GB DDR3的iMac上通過MatLab R2014b運行它。

您可以在此處使用logical indexing來代替IF-conditional語句,並使用一個小循環-

%// Get size parameters
[r,c] = size(z);

%// Get logical mask with ones for each column at places that satisfy the condition
%// mentioned as the IF conditional statement in the problem code
mask = z(1:r-4,:) == z(5:r,:) & z(2:r-3,:) == z(5:r,:) & ...
                                            bsxfun(@eq,z(end,:),z(5:r,:));

%// Use logical indexing to map entire z array and set mask elements as NaNs
for k = 1:4
    z([false(k,c) ; mask ; false(4-k,c)]) = NaN;
end

標桿

%// Size parameters
nrows = 479;
ncols = 12000;
max_num = 10;
num_iter = 10; %// number of iterations to run each approach, 
               %// so that runtimes are over 1 sec mark

z_org = randi(max_num,nrows,ncols); %// random input data of specified size  
disp('---------------------------------  With proposed approach')
tic
for iter = 1:num_iter    

    z = z_org;
    [..... code from the proposed approach ...]

end
toc, clear z k mask r c

disp('---------------------------------  With original approach')
tic
for iter = 1:num_iter

    z = z_org;
    [..... code from the problem ...]

end
toc

結果

案例1: z479 x 1672num_iter = 50

---------------------------------  With proposed approach
Elapsed time is 1.285337 seconds.
---------------------------------  With original approach
Elapsed time is 2.008256 seconds.

案例2: z479 x 12000num_iter = 10

---------------------------------  With proposed approach
Elapsed time is 1.941858 seconds.
---------------------------------  With original approach
Elapsed time is 2.897006 seconds.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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