2012-11-11 96 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我想我現在已經明白了... –