这里我有两个矩阵,一个表示成本,另一个表明何时进行比较.
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.0
并0.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)
这将有助于获得最小的非零成本,但如果存在可用的零元素,那将是错误的.
那么有更好的方法吗?
这里有两种可能的解决方案。两者本质上都涉及将所有不可用成本转换为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
. 然而,这并不能显着提高效率,因此如果偏好下标索引,那么您应该使用它们。
归档时间: |
|
查看次数: |
2294 次 |
最近记录: |