2011-07-07 10 views
3

私は実行に長時間(数時間)かかるいくつかのコードを持っており、if文で多くの比較を行っているためだと思います。私はそれをより速く走らせたいと思います。ランタイムを改善する助けとなる提案は誰にもありますか?誰かがコードを遅くすることについて別の考えを持っているなら、私はそれを試して修正することができます。Matlabの実行時間を改善しますか?

xPI = zeros(1,1783); 
argList2 = zeros(1,1783); 
aspList2 = zeros(1,1783); 
cysList2 = zeros(1,1783); 
gluList2 = zeros(1,1783); 
hisList2 = zeros(1,1783); 
lysList2 = zeros(1,1783); 
tyrList2 = zeros(1,1783); 

minList= xlsread('20110627.xls','CM19:CM25'); 
maxList= xlsread('20110627.xls','CN19:CN25'); 
N = length(pIList); 
for i = 1:N 
    if (argList(i)>= minList(1) && argList(i) <= maxList(1)) ... 
     && (aspList(i)>= minList(2) && aspList(i) <= maxList(2)) ... 
     && (cysList(i)>= minList(3) && cysList(i) <= maxList(3)) ... 
     && (gluList(i)>= minList(4) && gluList(i) <= maxList(4)) ... 
     && (hisList(i)>= minList(5) && hisList(i) <= maxList(5)) ... 
     && (lysList(i)>= minList(6) && lysList(i) <= maxList(6)) ... 
     && (tyrList(i)>= minList(7) && tyrList(i) <= maxList(7)) 

     xPI(i) = pIList(i); 
     argList2(i) = argList(i); 
     aspList2(i) = aspList(i); 
     cysList2(i) = cysList(i); 
     gluList2(i) = gluList(i); 
     hisList2(i) = hisList(i); 
     lysList2(i) = lysList(i); 
     tyrList2(i) = tyrList(i); 
     disp('passed test'); 
    end 
end 

答えて

7

コードをベクトル化することができます。私はいくつかのサンプルデータセットを作り、以下で実行している操作の一部を複製しました。

matA1 = floor(rand(10)*1000); 
matB1 = floor(rand(10)*1000); 

matA2 = zeros(10); 
matB2 = zeros(10); 

minList = [10, 20]; 
maxList = [100, 200]; 

indicesToCopy = (matA1 >= minList(1)) & (matA1 <= maxList(1)) & (matB1 >= minList(2)) & (matB1 <= maxList(2)); 

matA2(indicesToCopy) = matA1(indicesToCopy); 
matB2(indicesToCopy) = matB1(indicesToCopy); 

これ以上高速であるかどうかは分かりませんが、試してみる必要があります。

EDIT:
あなたは2つのだけのコールを作っているので、これはあまり重要ではありませんが、xlsreadは恐ろしく遅いです。関数のこの変形構文を使用して、これらの呼び出しを高速化することができます。

num = xlsread(filename, sheet, 'range', 'basic') 

キャッチはrange引数は無視され、シート全体が読み込まれるので、あなたは正しく結果をインデックスを台無しにする必要がありますということです。

+2

'indicesToCopy'配列を作るには、'& '要素論理的なもので、' && 'は論理的ではありません。 – Lambdageek

+2

+1、私は100の賭けを賭けるでしょう。それはかなり速くなるだろうということです。 (ちょうどループについて話す)。 –

+0

私はちょうどあなたの提案を試して、数時間から数分に大幅にランタイムを増加させました! –

6

profilerを使用すると、最も実行時間が長い行や機能を確認できます。

実行速度が大幅に向上するのは、コードvectorizingです。これは、ベクトル全体を一度に処理する演算を使用することを意味し、for -loopを反復処理する代わりに使用します。何かのように:

% make a logical vector indicating what you want to include 
ii = (argList >= minList(1) & argList <= maxList(1)) & ... 

% use it 
argList2(ii) = arglist(ii); % copies over every element where the corresponding ii is 1 
... 
+1

+1のコードを提案してください。 – Jonas

+1

プロファイラは最適化する場所を見つけるのに適したツールですが、ここではランタイムはおそらく単一の行ではないでしょう。むしろ、この全体のチャンクは、ベクトル化する必要がある「最適化ユニット」の1つです。誰かがまだベクトル化について知らなかったら、これがプロファイラの結果から明らかになるとは思わない。 – nibot

関連する問題