这里我有两个矩阵,一个表示成本,另一个决定何时进行比较。
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,并返回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)这将有助于获得最小非零成本,但如果存在可用的零个元素,则将是错误的。
那么有没有更好的方法呢?
发布于 2012-11-11 20:28:53
这里有两种可能的解决方案。两者本质上都涉及将所有不可用成本转换为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的调用。然而,这并没有在效率上给你带来巨大的节省,所以如果你对下标索引有偏好,那么你应该使用它们。
https://stackoverflow.com/questions/13331088
复制相似问题