2012-09-04 9 views
5

enter image description hereKorrelation in Matlab zwischen zwei Matrices

Hallo,

  1. würde Ich mag eine Korrelationsmatrix zwischen den beiden Datensatz über das präsentiert erstellen wird alle Erscheinungen von Nullen (im Bild oben ignorieren , die grüne Farbe), weiß jemand, was ist der effizienteste Weg, um ein reibungsloses Ergebnis zu erzielen?

  2. Gibt es eine Korrelationsmethode, die die Ähnlichkeit Punkt für Punkt identifizieren kann und dadurch die Ergebnisse die "Form" der ursprünglichen Matrix haben?

danken u

Anmerkung: Ich habe nicht die Matlab-Statistik-Toolbox

+0

Ich bin mir nicht sicher, ob ich dir folge. Was meinst du mit _ _ _ _ _ _ _ _ _ _ _ _ _ _ - _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ –

+0

Wenn Sie sich das Bild oben ansehen, neben den "Nullen" im oberen linken Teil des Bildes, sind die Nullen verstreut, ich möchte sie nicht von den Daten für die Korrelation ausgeschlossen – jarhead

+0

Was sollte die Dimension sein des Ergebnisses in 1.? Ich frage, weil eine Korrelation normalerweise zwei Vektoren benötigt und daraus einen einzelnen Skalar berechnet. – Mehrwolf

Antwort

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? 

die mit Ihrem zweiten Punkt Lassen Sie beginnen, weil es klar ist, was Sie es wollen. Sie möchten einen Punkt-zu-Punkt-Vergleich zweier Bilder durchführen, z. B. A und B. Dies läuft darauf hinaus, die Ähnlichkeit zweier Skalare a und b zu messen. Nehmen wir an, dass diese Skalare aus dem Intervall [0, Q] stammen, wobei Q von Ihrem Bildformat abhängt (Q == 1 oder Q == 255 sind in Matlab üblich).

Jetzt ist das einfachste Maß der Entfernung der Unterschied d = |a - b|. Sie können dies auf [0, 1] normalisieren und die Werte auch umwandeln, um Ähnlichkeit statt Abstand zu invertieren. In Matlab:

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

Sie erwähnt über das Ignorieren der Nullen in den Bildern. Nun, Sie müssen definieren, welches Ähnlichkeitsmaß Sie für eine Null erwarten. Eine Möglichkeit ist die Ähnlichkeit auf Null zu setzen, wann immer ein Pixel ist Null:

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

Man könnte auch sagen, dass die Ähnlichkeit dort nicht definiert ist und stellen Sie die Ähnlichkeit mit NaN:

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

Natürlich Sie können auch sagen, dass die Fehlanpassung zwischen 10 und 11 genauso schlecht ist wie die Fehlanpassung zwischen 100 und 110. In diesem Fall könnten Sie die Entfernung in Bezug auf die Summe a + b (bekannt als Bray Curtis Normalisierung oder normalisierte euklidische Metrik)

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

Probleme treten auf, wenn beide Matrizen am selben Ort ein Pixel mit einem Wert von Null haben. Auch hier gibt es mehrere Möglichkeiten: Sie können die Summe mit einem kleinen positiven Wert alpha (z. B. alpha = 1e-6) erhöhen, der eine Division durch Null verhindert: D = abs(A - B) ./ (alpha + A + B).

Eine weitere Option ist die unendlichen Werte in D und fügen Sie Ihre ‚Null-Verarbeitung‘ hier, das heißt

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

Sie sehen, es gibt viele Möglichkeiten zu ignorieren.

Sie sollten auf jeden Fall mehr über diesen Punkt nachdenken und eine bessere Beschreibung der zu berechnen. Wenn Ihre Matrizen die Größe m x m haben, haben Sie m^2 Variablen. Daraus können Sie eine Korrelationsmatrix m^2 x m^2 berechnen, die die Korrelation jedes Pixels mit jedem anderen Pixel misst. Diese Matrix hat auch die größten Werte in der Diagonalen (das sind die Varianzen). Ich würde jedoch nicht vorschlagen, die Korrelationsmatrix zu berechnen, wenn Sie nur zwei Realisierungen haben.

Eine andere Möglichkeit besteht darin, die Ähnlichkeit von Zeilen oder Spalten in den beiden Bildern zu messen. Dann haben Sie am Ende einen Vektor 1 x m der Korrelationskoeffizienten.

Ich weiß jedoch nicht, wie man eine Korrelationsmatrix der Größe m x m aus zwei Eingaben der Größe m x m berechnet, die die größten Werte in der Diagonalen hat.

+0

Tnx, ich werde mit dem arbeiten, was Sie angeboten haben, und sehen, wie es geht – jarhead

0

Um nur einen allgemeinen Korrelationskoeffizienten zu erhalten, würde ich corr2 verwenden. From the docs:

r = corr2(A,B)

Gibt den Korrelationskoeffizienten r zwischen A und B, wobei A und B Matrizen oder Vektoren derselben Größe sind. r ist ein skalares Doppel.

Grob gesagt, glaube ich, es ist nur corr(A(:), B(:)) berechnen.