在matlab中查找min元素的索引

时间:2012-11-11 12:22:36

标签: 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的索引}},在费用矩阵中为0.0(1, 2)

我试过

4

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

那么还有更好的方法吗?

1 个答案:

答案 0 :(得分: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。但是,这并没有为您节省大量的效率,因此如果您希望使用下标索引,那么您应该使用它们。