2012-11-11 16 views
5

ここでは、2つの行列があり、1つはコストを示し、もう1つはいつ比較するかを決定します。matlabの最小要素のインデックスを見つける

cost =  [0.2 0.0 0.3; 0.4 0 0; 0.5 0 0]; 
available = [1 1 0 ; 1 0 0; 0 0 0]; 
available = logical(available); 

私は0.20.00.4を比較し、コスト行列で(1, 2)または4ある0.0のインデックスを返します。この場合のコスト行列で分利用できる要素のインデックスを取得したいです。

私はこれが分ゼロ以外のコストを取得するのに役立ちますが、利用可能なゼロ要素が存在する場合、それは間違っているだろう

mul = cost .* available;  % Zero if not available, but I can't know if it is zero because cost is zero 
mul(~mul) = nan;    % Set zero to be NaN 
[minVal, minId] = min(mul) 

を試してみました。

そうするより良い方法がありますか?

+3

トピック:機能のような変数の名前付けを控えてください(例えば、「min」)。 –

答えて

2

ここには2つの解決策があります。両方とも、基本的にすべての利用不可能なコストをInfに変換します。

%#Set up an example 
Cost =  [0.2 0 0.3; 0.4 0 0; 0.5 0 0]; 
Available = [1 1 0; 1 0 0; 0 0 0]; 

%#Transform non-available costs to Inf 
Cost(Available == 0) = Inf; 

%#Obtain indices using find 
[r, c] = find(Cost == min(min(Cost))) 

%#Obtain linear indices and convert using ind2sub 
[~, I1] = min(Cost(:)); 
[r2, c2] = ind2sub(size(Cost), I1); 

両方のソリューションは、一意の最小値がない場合の最初の最小値のみを返します。また、方法は、すべての利用可能なコストがInfであるという逆のケースでは失敗します(ただし、すべての費用が無限であれば大きな問題があると思います...)。

私はいくつかのスピードテストを行いました.の寸法に関係なく、2番目の方法は確実に高速ですので、厳密に推奨する必要があります。また、線形インデックスのみを必要とし、添え字インデックスを必要としない場合は、もちろん呼び出しをind2subにドロップすることができます。ただし、これで効率が大幅に節約されるわけではありません。したがって、添え字インデックスの設定がある場合は、それを使用する必要があります。

+0

これは正しく終了しないと思います。 'min(cost(available));' cost(available) 'によって返された新しい行列にminIdを返します。この場合は3です。しかし、私はidをコスト行列に入れて4にします。 – Ovilia

+0

最初の最小要素で十分です。 – Ovilia

+0

@Ovilia私は今それを持っていると思う... –

関連する問題