这里我有两个矩阵,一个表示成本,另一个表明何时进行比较。
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.0
和0.4
并返回{{1的索引}},在费用矩阵中为0.0
或(1, 2)
。
我试过
4
这将有助于获得最小的非零成本,但如果存在零元素,则可能是错误的。
那么还有更好的方法吗?
答案 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
。但是,这并没有为您节省大量的效率,因此如果您希望使用下标索引,那么您应该使用它们。