2012-09-04 49 views
5

enter image description herecorrelación en Matlab entre dos matrices

Hola,

  1. me gustaría crear una matriz de correlación entre el conjunto de dos datos presentados anteriormente que ignorará cualquier apariciones de ceros (en la imagen superior , el color verde), cualquiera sabe cuál es la forma más eficiente que producirá un resultado suave?

  2. ¿Hay algún método de correlación que pueda identificar la similitud punto por punto y por lo tanto los resultados tendrán la "forma" de la matriz original?

gracias u

nota: no tengo la caja de herramientas estadística MATLAB

+0

No estoy seguro de que te esté siguiendo. ¿Qué quiere decir con "_ignore any appearnaces of zeros_"? –

+0

Si observa la imagen anterior, además de los "ceros" en la parte superior izquierda de la imagen, los ceros están dispersos, no quiero excluirlos de los datos utilizados para la correlación – jarhead

+0

¿Cuál debería ser la dimensión? del resultado en 1.? Lo estoy preguntando porque una correlación normalmente toma dos vectores y computa un escalar único de ella. – Mehrwolf

Respuesta

5
2. Is there any correlation method that can identify the similarity point by 
    point and by thus the results will have the "shape" of the original matrix? 

Vamos a empezar con el segundo punto, porque es más clara, lo que quiere allí. Desea hacer una comparación punto por punto de dos imágenes, por ejemplo, A y B. Esto se reduce a medir la similitud de dos escalares a y b. Supongamos que estos escalares son del intervalo [0, Q], donde Q depende del formato de su imagen (Q == 1 o Q == 255 son comunes en Matlab).

Ahora, la medida más simple de distancia es la diferencia d = |a - b|. Es posible que desee normalizar esto a [0, 1] y también invertir los valores para medir similitud en lugar de distancia. En Matlab:

S = 1 - abs(A - B)/Q; 

Mencionaste acerca de ignorar los ceros en las imágenes. Bueno, necesitas definir qué medida de similitud esperas para un cero. Una posibilidad es establecer la similitud a cero, cada vez que un píxel es cero:

S(A == 0 | B == 0) = 0; 

También se podría decir que la semejanza no es indefinido y establecer la similitud con NaN:

S(A == 0 | B == 0) = nan; 

Por supuesto, También puede decir que la falta de coincidencia entre 10 y 11 es tan mala como la falta de coincidencia entre 100 y 110. En este caso, podría tomar la distancia con respecto a la suma a + b (conocida como normalización de Bray Curtis o métrica euclidiana normalizada)

D = abs(A - B) ./ (A + B) 
S = 1 - D/max(D(:)); 

Tiene problemas, si ambas matrices tienen un píxel de valor cero en la misma ubicación. Nuevamente, hay varias posibilidades: puede aumentar la suma con un pequeño valor positivo alpha (por ejemplo, alpha = 1e-6) que previene una división por cero: D = abs(A - B) ./ (alpha + A + B).

Otra opción es hacer caso omiso de los valores infinitos en D y añadir su 'cero-procesamiento' aquí, es decir

D = abs(A - B) ./ (A + B) 
D(A == 0 | B == 0) = nan; 
S = 1 - D/max(D(:)); 

Usted ve, hay un montón de posibilidades.

1. I would like to create a correlation matrix [...] 

Definitivamente debería pensar más sobre este punto y proponer una mejor descripción de lo que debe calcular. Si sus matrices son del tamaño m x m, tiene m^2 variables. A partir de esto, puede calcular una matriz de correlación m^2 x m^2, que mide la correlación de cada píxel con cada otro píxel. Esta matriz también tendrá los valores más grandes en la diagonal (estas son las varianzas). Sin embargo, no recomendaría calcular la matriz de correlación si solo tiene dos realizaciones.

Otra opción es medir la similitud de filas o columnas en las dos imágenes. Luego terminas con un vector 1 x m de coeficientes de correlación.

Sin embargo, no sé cómo calcular una matriz de correlación de tamaño m x m a partir de dos entradas de tamaño m x m, que tiene los valores más grandes en la diagonal.

+0

tnx, voy a trabajar con lo que ofreces, y ver cómo va – jarhead

0

Para obtener un coeficiente de correlación general, usaría corr2. From the docs:

r = corr2(A,B)

Devuelve el coeficiente de correlación r entre A y B, donde A y B son matrices o vectores de la misma tamaño. r es un doble escalar.

Aproximadamente, creo que es solo el cálculo de corr(A(:), B(:)).

Cuestiones relacionadas