2013-08-07 10 views
6

で行うん:は、どのようなコマンドA(〜A)は、実際に私は行列の非ゼロ最小値を見つけるための最も効率的な方法を見つけるために見て、フォーラムでこれを発見されたMATLAB

は、データがあることしてみましょうマトリックスA

A(~A) = nan; 
minNonZero = min(A); 

これは非常に短く効率的です(少なくともコード行数で)。私はこれを行うと何が起こるか理解していません。私は+-\のような行列上にはoperationではないので、これに関するドキュメントは見つかりません。

誰かが私に説明したり、何かを理解するのに役立つリンクや何かを教えてもらえますか? ありがとうございました!

+2

'min'は' NaN'よりも 'Inf'を無視するようです。 –

答えて

9

これは、MATLABでlogical indexing

~がない演算子で使用しています。 double配列で使用すると、すべての要素がゼロに等しいことがわかります。例:論理行列で

~[0 3 4 0] 

結果

[1 0 0 1] 

それは今= A([1 0 0 1])A(~A)その後A = [0 3 4 0]のであれば、すべてのゼロ要素

を見つけるための簡単な方法= [1 0 0 1]~AのIE 。 A([1 0 0 1])は、この場合の要素には最後に1と素子4

A(~A) = NaNがあなたを見つけるためmin無視してNaN0に等しかった内のすべての要素を交換しますので、該当する要素に影響を与えるだけに、論理インデックスを使用しています最小の非ゼロ要素。

3

あなたが提供するコード:

A(~A) = NaN; 
minNonZero = min(A); 

は以下を行います。

  1. 論理インデックスを作成しますNaN値を割り当てることによって、A
  2. 変更A上の論理インデックスを適用
  3. を含まないうちに、すべての値の最小値を取得します。の値

これは変更されたAを残しますが、これは望ましくない可能性があることに注意してください。しかし、より重要なのは、Aを変更して、おそらく大規模な行列を最小限に抑えたとしても、これにはいくつかの非効率性があります。 したがって、あなたは物事をスピードアップすることができ(さらに1行を減らす)ことによって:

minNonZero = min(A(logical(A))) 

は、基本的には今、ステップ3をスキップしているし、おそらくステップ4に減少しました。

minNonZero = min(A(A~=0)) 

が、私はこのために何らかの正当な理由を持っていないが、ステップ1が今より効率的に行われているように思える:

はまた、あなたが行うことによって、追加の小さなスピードアップを得るように見えます。

+0

私はよく分かりませんが、 '〜A'は' Aより遅くなる可能性があります〜= 0'であり、前者が '論理'にキャストしてから否定するためです。 – Edric

+0

@エドリックそれは確かに理にかなっています。しかし、私はそれを否定してはならないことが判明しました。否定がなければ、それはまだ遅いです。私の編集したポストを見てください。 –

関連する問題