在matlab中查找min元素的索引

Ovi*_*lia 5 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);
Run Code Online (Sandbox Code Playgroud)

我想获得在成本矩阵最小可用的元素,在这种情况下会比较的指标0.2,0.00.4和返回的指标0.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)
Run Code Online (Sandbox Code Playgroud)

这将有助于获得最小的非零成本,但如果存在可用的零元素,那将是错误的.

那么有更好的方法吗?

Col*_*ers 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);
Run Code Online (Sandbox Code Playgroud)

在没有唯一最小值的情况下,两种解决方案都只会返回第一个最小值。另外,在所有可用成本都是的反常情况下,该方法将失败Inf(但我猜如果所有成本都是无限的,你会遇到更大的问题......)。

我已经做了一些速度测试,无论 的尺寸如何,第二种方法肯定更快Cost,所以应该严格首选。另外,如果您只想要线性索引而不是下标索引,那么您当然可以删除对ind2sub. 然而,这并不能显着提高效率,因此如果偏好下标索引,那么您应该使用它们。