2012-11-11 61 views
5

这里我有两个矩阵,一个表示成本,另一个决定何时进行比较。查找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并返回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) 

这将有助于获得最小非零成本,但如果存在零个元件,其可用的,那就大错特错了。

那么还有更好的方法吗?

+3

题外话:你应该避免命名像函数这样的变量(例如'min')。 –

回答

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。但是,这并不能为您节省大量的效率,所以如果您对下标指数有偏好,那么您应该使用它们。

+0

我想这不是正确的。 'min(cost(available));'将minId返回到由'cost(available)'返回的新矩阵中,在这种情况下,它是3.但是我想要id在成本矩阵中,应该是4. – Ovilia

+0

Index of第一个最小元素就足够了。 – Ovilia

+0

@Ovilia我想我现在已经明白了... –