2012-06-27 22 views
8

Sto cercando di trovare un array 2d che rappresenti i valori minimi della terza dimensione in un array 3d., Ad es.Trova il valore minimo non zero in una matrice

a = floor(rand(10,10,3).*100); % representative structure 
b = min(a,[],3); % this finds the minimum but also includes 0 

Ho provato ad utilizzare:

min(a(a>0),3) 

ma che non è corretto? Immagino di poter ordinare la terza dimensione di ae quindi trovare il minimo entro 1: depth-1 - ma non sembra il modo più efficace?

Qualche idea?

+0

noti che se si ordina, il minimo è il secondo (indice 1 se indici MATLAB da 0) elemento, non si devono trovare il minimo di '1: depth-1' più. Ma sì, è ancora inefficiente e deve esserci un modo migliore. – IVlad

+0

Dovrebbe essere 'min (a, [], 3)', altrimenti prendi il più piccolo di 'a' e 3 – Jonas

+0

Grazie per aver segnalato che digitato Jonas, ho corretto ora. – trican

risposta

7

Il problema è che a(a>0) restituisce un array lineare, così si ritroverà con un minimo, come opposto a un array 2D con minimi.

Il modo più sicuro di prendere il minimo di valori diversi da zero è mascherarli con Inf, in modo che gli zeri non interferiscano con il calcolo del minimo.

tmp = a; 
tmp(tmp==0) = Inf; 

b = min(tmp,[],3); 
+0

Che sfortunatamente fallisce per le matrici sparse, dal momento che può essere molto costoso assegnare un valore a tutti gli zeri in una (sparsa) matrice sparsa. Mi rendo conto che non era la domanda dell'OP, ma solo una FYI. –

3

Una possibilità sarebbe semplicemente di rendere tutti i valori zero molto grandi.

Ad esempio, se si sa che nessun elemento avrebbe mai essere maggiore di 1000 è possibile utilizzare

b = min(a+1000*(a==0),[],3) 
+1

uso inf invece di 1000 – Dan

0

semplicemente assegnare quei punti all'infinito se il valore è zero in modo sempre la risposta min non conta zero quelli ..... come un (a == 0) = inf; % quindi conta il minimo minelemento = min (a);

0

rimuovere zero elementi di questa matrice:

a = [10 2 0 4 5; 156 1.7 45 23 0 ]; 
    a(a == 0) = NaN;% not a number 
    min(a(:)) 
    >> ans = 1.7 
Problemi correlati