2012-11-11 15 views
5

Qui ho due matrici, una che indica il costo e l'altra determina quando confrontarla.Trova l'indice dell'elemento min in 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); 

voglio ottenere l'indice dell'elemento disponibili min nella matrice costo, che in questo caso sarebbe confrontare 0.2, 0.0 e 0.4 e restituire l'indice di 0.0, che è (1, 2) o 4 nella matrice costo .

ho cercato

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) 

Ciò contribuirà ad ottenere il minimo costo diverso da zero, ma se esiste zero elementi che sono disponibili, sarebbe sbagliato.

Quindi c'è un modo migliore per farlo?

+3

Off-topic: si dovrebbe astenersi dal denominare variabili come le funzioni (ad esempio 'min'). –

risposta

2

Ecco due possibili soluzioni. Entrambi implicano essenzialmente la conversione di tutti i costi non disponibili a 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); 

Entrambe le soluzioni restituiranno solo il primo valore minimo nell'istanza che non esiste un minimo univoco. Inoltre, il metodo fallirà nel caso perverso che tutti i costi disponibili siano Inf (ma suppongo tu abbia problemi più grandi se tutti i tuoi costi sono infiniti ...).

Ho eseguito alcuni test di velocità e il secondo metodo è decisamente più veloce, indipendentemente dalle dimensioni dello Cost, quindi deve essere strettamente preferito. Inoltre, se si desidera solo indici lineari e non indici indice, è possibile, naturalmente, lasciare la chiamata a ind2sub. Tuttavia, questo non ti dà enormi risparmi in termini di efficienza, quindi se c'è una preferenza per gli indici degli indici allora dovresti usarli.

+0

Suppongo che questo non si risolva correttamente. 'min (costo (disponibile));' restituisce il minId in una nuova matrice restituita da 'costo (disponibile)', che in questo caso è 3. Ma voglio l'id nella matrice dei costi, che dovrebbe essere 4. – Ovilia

+0

Indice di il primo elemento min è sufficiente. – Ovilia

+0

@Ovilia Penso di averlo capito ora ... –