2012-09-04 52 views
5

enter image description herecorrelazione in MATLAB tra due matrici

Hi,

  1. desidero creare una matrice di correlazione tra l'insieme di dati due presentati sopra che ignorerà qualsiasi comparsa di zeri (nella foto sopra , il colore verde), qualcuno sa qual è il modo più efficiente per produrre un risultato uniforme?

  2. Esiste un metodo di correlazione in grado di identificare la somiglianza punto per punto e quindi i risultati avranno la "forma" della matrice originale?

thank u

nota: non ho la casella degli strumenti MATLAB statistica

+0

Non sono sicuro di seguirti. Cosa intendi per "_ignore any appearnaces of zeros_"? –

+0

Se guarderai l'immagine qui sopra, oltre agli "zeri" nella parte in alto a sinistra dell'immagine, ci sono degli zeri sparsi, non voglio escluderli dai dati usati per la correlazione – jarhead

+0

Quale dovrebbe essere la dimensione del risultato in 1.? Sto chiedendo perché una correlazione normalmente richiede due vettori e calcola un singolo scalare da esso. – Mehrwolf

risposta

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? 

Cominciamo con il secondo punto, perché è più chiaro, ciò che si vuole lì. Si desidera eseguire un confronto punto per punto di due immagini, ad esempio A e B. Questo si riduce alla misurazione della somiglianza di due scalari a e b. Supponiamo che questi scalari siano dell'intervallo [0, Q], dove Q dipende dal formato dell'immagine (Q == 1 o Q == 255 sono comuni in Matlab).

Ora, la misura di distanza più semplice è la differenza d = |a - b|. Potresti voler normalizzare questo valore a [0, 1] e anche invertire i valori per misurare la differenza anziché distanza. In Matlab:

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

Hai parlato di ignorare gli zeri nelle immagini. Bene, devi definire, quale misura di similarità ti aspetti per uno zero. Una possibilità è quella di impostare la somiglianza a zero, ogni volta che un pixel è pari a zero:

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

Si potrebbe anche dire che la somiglianza non è definita e impostare la somiglianza con NaN:

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

Naturalmente, puoi anche dire che la discrepanza tra 10 e 11 è peggiore della discrepanza tra 100 e 110. In questo caso, puoi prendere la distanza rispetto alla somma a + b (nota come normalizzazione Bray Curtis o metrica euclidea normalizzata)

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

Si verificano problemi, se entrambe le matrici hanno un pixel di valore zero nella stessa posizione. Anche in questo caso, esistono diverse possibilità: è possibile aumentare la somma con un piccolo valore positivo alpha (ad esempio alpha = 1e-6) che impedisce una divisione per zero: D = abs(A - B) ./ (alpha + A + B).

Un'altra opzione è quella di ignorare i valori infiniti in D e aggiungere il 'zero elaborazione' qui, vale a dire

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

Vedete, ci sono un sacco di possibilità.

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

Si dovrebbe sicuramente pensare di più a questo punto e trovare una descrizione migliore di quello che per calcolare. Se le tue matrici sono di dimensioni m x m, hai le variabili m^2. Da questo è possibile calcolare una matrice di correlazione m^2 x m^2, che misura la correlazione di ogni pixel su ogni altro pixel. Questa matrice avrà anche i valori più grandi nella diagonale (queste sono le varianze). Tuttavia, non suggerirei di calcolare la matrice di correlazione se hai solo due realizzazioni.

Un'altra opzione è misurare la somiglianza di righe o colonne nelle due immagini. Quindi si finisce con un vettore 1 x m di coefficienti di correlazione.

Tuttavia, non so come calcolare una matrice di correlazione della dimensione m x m da due ingressi di dimensione m x m, che ha i valori più grandi nella diagonale.

+0

tnx, lavorerò con quello che mi hai offerto e vedremo come va – jarhead

0

Per ottenere un coefficiente di correlazione generale, utilizzare corr2. From the docs:

r = corr2(A,B)

Restituisce il coefficiente di correlazione r tra A e B, dove A e B sono matrici o vettori della stessa dimensioni. r è un doppio scalare.

Approssimativamente, credo che sia solo il calcolo corr(A(:), B(:)).

Problemi correlati