2012-06-27 184 views
8

Estoy tratando de encontrar una matriz 2D que represente los valores mínimos de la 3ª dimensión en una matriz 3D., P.Encuentre el valor mínimo distinto de cero en una matriz

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

He intentado utilizar:

min(a(a>0),3) 

pero eso no es correcto? Supongo que podría ordenar la tercera dimensión de a y luego encontrar el mínimo dentro de 1: profundidad-1, pero ¿no parece la forma más eficiente?

¿Alguna idea?

+0

Tenga en cuenta que si se ordena, el mínimo es el segundo (índice 1 si los índices de Matlab de 0) elemento, que no tienen que encontrar el mínimo de '1: depth-1' más. Pero sí, eso sigue siendo ineficiente y tiene que haber una mejor manera. – IVlad

+0

Debería ser 'min (a, [], 3)', de lo contrario tomaría el más pequeño de 'a' y 3 – Jonas

+0

Gracias por señalar a ese tipo de error Jonas, lo he corregido ahora. – trican

Respuesta

7

El problema es que a(a>0) devuelve una serie lineal, por lo que va a terminar con un mínimo, ya opuesto a una matriz 2D con mínimos.

La forma más segura de tomar el mínimo de valores distintos de cero es enmascararlos con Inf, de modo que los ceros no interfieran con el cálculo del mínimo.

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

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

Desafortunadamente, esto es contraproducente para las matrices dispersas, ya que puede ser muy costoso asignar un valor a todos los ceros en una matriz dispersa (grande). Me doy cuenta de que esa no era la pregunta del OP, sino solo un FYI. –

3

Una posibilidad sería simplemente hacer todos los valores cero muy grandes.

Por ejemplo, si se sabe que no hay elementos de alguna vez ser mayor que 1000 podría utilizar

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

use inf en lugar de 1000 – Dan

0

simplemente asignar esos puntos el infinito, donde el valor es cero por lo que siempre la respuesta no contará min cero ..... como los un (a == 0) = inf; % luego cuente el mínimo minelement = min (a);

0

quitar cero elementos de matriz de la siguiente manera:

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