2011-02-22 54 views
17

私は、数値の2次元配列の最小値の位置を見つけるスクリプトをMATLABに書き込もうとしています。私はこの配列には最小値が1つしかないことを確信しています。したがって、同じ最小値を持つ配列内に複数の場所を持つことは問題になりません。 Iは、アレイの最小を見つけることができるが、30×30アレイでは、Iは最小値であることをどの行と列知りたい。min機能の説明に2D配列の最小値のインデックスをMATLABに表示させる方法は?

答えて

28

、最小値を取得し、あなたはすでに見つけ使うだけで、最小を計算した場合、インデックスを返すように見つけるために、分を兼ね備えています。

>> a=magic(30); 
>> [r,c]=find(a==min(min(a))) 

r = 
    1 
c = 
    8 

それとも、論理アドレッシングがあなたに真理値表を与えるために使用することができ、その場合には、あなたが代わりに論理配列でそれを定義したいことがあり、位置情報を、どのように使用するかによって異なります。

>> a=magic(30); 
>> locn=(a==min(min(a))); 
+0

ありがとうございます!まさに私が必要なもの! –

7

ルック。最小値とインデックスを返すことができます。 2次元配列の場合、2回呼び出すだけです。

A = rand(30); % some matrix 
[minColVal, minColIdx] = min(A); 
[minRowVal, minRowIdx] = min(minColVal); 

minVal = minRowVal; 
minValIdx = [minColIdx(minRowIdx), minRowIdx]; 

編集:B3のソリューション@おそらく、計算よりエレガントである(より速く、より少ない一時的なスペースを必要とする)

13

あなたは、ベクトルに行列を作り変えるMINを使用して、最小のインデックスを検索し、これを変換することができ行列インデックスへの線形インデックス:代替バージョンとして

 
>> x = randi(5, 5) 

x = 

    5  4  4  2  4 
    4  2  4  5  5 
    3  1  3  4  3 
    3  4  2  5  1 
    2  4  5  3  5 

>> [value, index] = min(reshape(x, numel(x), 1)); 
>> [i,j] = ind2sub(size(x), index) 

i = 

    3 


j = 

    2 
+0

+1優雅な解決策! – groovingandi

+6

いくつかの文字を保存するには、reshape()の代わりにx(:)を使用することができます。 – zellus

+0

@zellus:私に思い出させてくれてありがとう!私は、これをやる別の方法があると感じていました。 –

0

は、ベクターの一部でminまたはmaxを検索するには - Aがベクトルと「下界」と「は、UpperBound」である場合は、最大を見つける必要があり、その中のベクトルの境界がある(もしくは分)値は、このコマンドを使用 -

[Value,Index]=min(A(lowerBound:upperBound)); 

これはオフセットとして「下界」と同様minまたはmax値(下界間)及び(uppedBound)と 「インデックス」と「値」を返します。したがって、絶対インデックスを見つけるには、 "lowerBound"をインデックスに追加する必要があります。

0

インライン関数を使用する別の解決方法が機能します。

>> min_index = @(matrix) find(matrix == min(reshape(matrix, [1,numel(matrix)]))); 

    >> a=magic(30); 
    >> [r,c]=min_index(a) 

    r = 
     1 

    c = 
     8 
関連する問題