2011-03-31 11 views
1

これに結果を結びつけるのではなく、次のように他の方法がありますか?ループは維持されますが、vector=[vector,sum(othervector)];は他の方法で取得できますか?配列の連結を高速化するには?

vector=[]; 

while a - b ~= 0 
    othervector = sum(something') %returns a vector like [ 1 ; 3 ] 
    vector=[vector,sum(othervector)]; 
    ... 

end 

vector=vector./100 
+2

'a'と' b'は何に依存していますか? 「何か」は何に依存しているのですか? 'a'と' b'で?それはいつも同じですか? – Darhuuk

+0

実際に条件を入れるのではなく、私が知りたいことは 'vector = [vector、sum(othervector)];を実行する方法です。 '他の方法では、ループが100回続くと言うことができます – cMinor

+0

密接に関連する/重複する可能性のある質問:[matlab - スピードのために事前割り当てを検討する](http://stackoverflow.com/questions/2151636/matlab-consider-preallocating-for-speed )、[MATLABの拡張可能なデータ構造](http://stackoverflow.com/questions/2625048/growable-data-structure-in-matlab)、[MATLABで長さが不明な行列?](http://stackoverflow.com/questions/1548116/matrix-of-unknown-length-in-matlab) – gnovice

答えて

2

速度を最適化する場合は、ベクトルを事前に割り当てて、@Egonがすでに応答しているため、インデックスのカウンタを設定する必要があります。

vector=[vector,sum(othervector)];の別の書き方をしたい場合は、代わりにvector(end + 1) = sum(othervector);を使用できます。

3

これは実際にあなたがやろうとしていることによります。このコードから始めて、あなたがやっている行動やその行動を変えることができるかどうか考える必要があります。提示したコードスニペットには依存性がほとんどない(つまり、a、b、something、vectorはどのように関連しているのか)ので、あいまいな解決策しか提示できないと思います。

新しい結果を連結して配列を動かし続けるという効果を回避するために、コードを削除したいと思っています。

まずアプリケーションの最も遅い部分がこの原因であることを確認してください。 Matlabプロファイラを見てみましょう。あなたのコードのその部分が主要な時間ではない場合は、それを改善するために多くの時間を費やしてはいけません(そして、mlintにそのコード行を無視すると言うだけです)。

繰り返し回数が一定であることを確実にするためにコードを分析することができれば、変数を事前に割り当ててパフォーマンス上のペナルティを防ぐことができます(最悪の場合はforループを書くか、 。あるいは、いくつかの変数を取り除くことができれば、ループの外にある任意のループ不変条件を動かすのにも役立ちます。常に許容範囲のものがあります。その場合には、ダブルスの平等をチェックするには注意してください。あなたのコードの性質は、例えば、あなたがコンバージェンスを達成するために反復されている(これを許可しない場合

vector = zeros(1,100); 
while a - b ~= 0 
    othervector = sum(something); 
    vector(iIteration) = sum(othervector); 
    iIteration = iIteration + 1; 
end 

:だから、このようになります。 )、パフォーマンスを向上させるために実行できるトリックがいくつかありますが、そのほとんどは大まかなルールであり、悪い状況を最大限に活用しようとしています。この最後のケースでは、メンテナンスコードを追加してパフォーマンスを少し向上させることができます(しかし、時間消費で得られるもの、メモリ使用量が減ります)。

あなたはコードは、ほとんどの時間の100回の* nの反復を実行することを期待し、あなたがこのような何かをしようとするかもしれない、のは、言ってみましょう:

iIteration = 0; 
expectedIterations = 100; 

vector = []; 
while a - b ~= 0 
    if mod(iIteration,expectedIterations) == 0 
     vector = [vector zeros(1,expectedIterations)]; 
    end 
    iIteration = iIteration + 1; 
    vector(iIteration) = sum(sum(something)); 
    ... 

end 

vector = vector(1:iIteration); % throw away uninitialized 
vector = vector/100; 

それはかなり見て、代わりの配列のサイズを変更しない場合があります各繰り返しでは、配列は100回目の繰り返しごとにサイズが変更されます。私はこのコードを実行していませんが、以前のプロジェクトでは非常に似たコードを使用しています。

関連する問題