5

ここには 2 つのマトリックスがあり、1 つはコストを示し、もう 1 つはいつ比較するかを決定します。

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.2、コスト マトリックス内のまたはのインデックスを返します。0.00.40.0(1, 2)4

私は試した

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)

これはゼロ以外の最小コストを取得するのに役立ちますが、利用可能な要素がゼロである場合は間違っています。

そうするためのより良い方法はありますか?

4

1 に答える 1

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(ただし、すべてのコストが無限である場合は、より大きな問題が発生すると思います...)。

私はいくつかの速度テストを行いましたCost. また、添字インデックスではなく線形インデックスのみが必要な場合は、もちろん への呼び出しを削除できますind2sub。ただし、これによって効率が大幅に向上するわけではないため、添え字インデックスを優先する場合は、それらを使用する必要があります。

于 2012-11-11T12:28:53.473 に答える