2009-06-02 42 views
14

Ich habe zwei Matrizen x und y, beide sind Ergebnisse von verschiedenen Algorithmen/Routinen, die das gleiche Ergebnis berechnen sollen. Während ich weiß, dass das isequal() überprüfen würde, ob x und y die gleiche Matrix sind, wären die Einträge in diesen Matrizen nicht genau die gleichen (d. H. Einige Einträge können im Worst-Case-Szenario mit 5% aus sein). Was wäre in diesem Szenario die beste Methode, sie zu vergleichen, um zu sehen, ob sie nah genug sind, um als dasselbe Ergebnis betrachtet zu werden? Vielen Dank im Voraus für die Ratschläge.Vergleichen zweier Matrizen in Matlab

+1

Diese Frage ist ziemlich alt, aber mathematisch würden Sie verwenden möchten 'Norm (A-B)/Norm (A)', nicht die folgenden Lösungen. – rlbond

Antwort

5

Ändern Edric's Lösung:

absTol = 1e-3; % You choose this value to be what you want! 
relTol = 0.05; % This one too! 
absError = x(:)-y(:); 
relError = absError./x(:); 
relError(~isfinite(relError)) = 0; % Sets Inf and NaN to 0 
same = all((abs(absError) < absTol) & (abs(relError) < relTol)); 

Die Variable gleiche wird falsch, wenn entweder die absolute oder der relative Fehler eines Elements ist größer als alle Toleranzen, die Sie wählen. Wenn Elemente von x zufällig genau 0 sind, dann könnten einige der Elemente von relError entweder unendlich oder nicht-eine-Zahl sein, also habe ich die ISFINITE Funktion verwendet, um diese Werte durch Setzen zu ignorieren zu 0.

Ich würde nicht vorschlagen IMAGESC Plots zu verwenden, da 1) die Daten skaliert wird, wenn es angezeigt wird, 2) die Colormap für die Anzeige hat eine diskrete Anzahl von Farbwerten (was ich denke, ist 256 standardmäßig, daher viel Rundung), und 3) feine Unterschiede in der Farbe sind möglicherweise nicht so offensichtlich, wie es beim visuellen Vergleich zweier Diagramme der Fall ist.

13

Diese Versuchen:

tf = abs((A-B)./B)<0.05 

Dies wird eine logische Matrix zurück, die für jedes Element der wahr ist, wenn der relative Unterschied zwischen A und B in Bezug auf B weniger als 5 Prozent ist.

Wenn Sie zu fragen, ob alle diese wahr sind (sie alle erfüllen die obige Bedingung):

all(tf(:)) 
+0

eine bessere Antwort von dem, was ich tatsächlich tat. – bastijn

+1

Brauchen Sie hier irgendwo keinen absoluten Wert? – Jim

+0

Ja, ich habe es jetzt hinzugefügt. Vielen Dank. –

4

Ich würde so etwas wie dies mit einer absoluten Toleranz sowie eine relative Toleranz zu tun:

function same = tol(x, y) 
absTol = 1e-3; 
relTol = 0.05; 
errVec = abs(x(:) - y(:)); 
same = all((errVec < absTol) | (errVec./x(:) < relTol)); 
+0

Ich versuchte sowohl Edrics als auch Andrews Methode.Obwohl ich eine Ausgabe von der Funktion als falsch erhalte, wenn ich die beiden Ergebnisse visuell vergleiche, indem ich sie mit der Funktion imagesc() auftrage, sehen sie sehr ähnlich aus. Daher bin ich mir immer noch nicht sicher, was ich davon halten soll. – stanigator

1

Wenn Sie sehr kleine Wertepaare in x und y haben, würde das Ergebnis 0 ergeben, obwohl die Werte selbst ignoriert werden können. Also, ein Zusatz zur akzeptierten Lösung

relError(x < absTol) = 0;

kann verwendet werden, um sehr kleine Fehler zu verwerfen. Daher wird der relative Fehler für diese Werte nicht berücksichtigt.

-2

nutzen ‚IsEqual (a, b) wobei a und b sind zwei Matrizen, wenn 1 es wahr ist

+1

Beachten Sie, dass Op speziell gesagt, dass isequal nicht funktionieren würde, da ein Fehler vorliegt. –

0

für Matrizen x und y enthält, Gleitkommazahlen, kann geprüft werden, ob Arrayelemente sind in einem gegeben Toleranz zueinander. Beispielcode:

tol = 0.05; 

result = abs(x - y) <= tol; 
Verwandte Themen