5

这里我有两个矩阵,一个表示成本,另一个决定何时进行比较。

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返回 的索引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)

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

那么有没有更好的方法呢?

4

1 回答 1

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 回答