Gibt es eine eingebaute MATLAB-Funktion, um herauszufinden, ob eine Matrix einen bestimmten Wert enthält? (ala PHPs in_array()
)
matlab
function
matrix
floating-point
Zenna
quelle
quelle
Antworten:
Viele Möglichkeiten, dies zu tun. ismember ist das erste, das mir in den Sinn kommt, da es sich um eine festgelegte Mitgliedschaftsaktion handelt, die Sie durchführen möchten. So
X = primes(20); ismember([15 17],X) ans = 0 1
Da 15 keine Primzahl ist, aber 17, hat ismember hier seine Arbeit gut gemacht.
Natürlich funktioniert find (oder eines) auch. Aber diese sind nicht in dem Sinne vektorisiert, wie es das Mitglied war. Wir können testen, ob 15 in der durch X dargestellten Menge enthalten ist, aber um diese beiden Zahlen zu testen, wird eine Schleife oder aufeinanderfolgende Tests durchgeführt.
~isempty(find(X == 15)) ~isempty(find(X == 17))
oder,
any(X == 15) any(X == 17)
Abschließend möchte ich darauf hinweisen, dass Tests auf genaue Werte gefährlich sind, wenn die Zahlen echte Floats sein können. Tests gegen ganzzahlige Werte, wie ich gezeigt habe, sind einfach. Tests gegen Gleitkommazahlen sollten jedoch normalerweise eine Toleranz verwenden.
tol = 10*eps; any(abs(X - 3.1415926535897932384) <= tol)
quelle
any
. Aber vielleicht möchten Sie das selbst messen (mittic
undtoc
).ismembertol
.du kannst tun:
A = randi(10, [3 4]); %# a random matrix any( A(:)==5 ) %# does A contain 5?
Um dies oben auf vektorisierte Weise zu tun , verwenden Sie:
any( bsxfun(@eq, A(:), [5 7 11] )
oder wie @woodchips vorschlägt:
ismember([5 7 11], A)
quelle
A
jeden dieser Werte enthält (z. B. die[true, true, false]
BedeutungA
enthält die Werte5
und7
nicht11
).Wenn Sie überprüfen müssen, ob sich die Elemente eines Vektors in einem anderen befinden, ist die beste Lösung
ismember
die in den anderen Antworten erwähnte.ismember([15 17],primes(20))
Wenn Sie sich jedoch mit Gleitkommazahlen beschäftigen oder nur enge Übereinstimmungen wünschen (+ - 1000 ist ebenfalls möglich), ist die beste Lösung, die ich gefunden habe, die ziemlich effiziente Dateiaustauschübermittlung:
ismemberf
Es gibt ein sehr praktisches Beispiel:
[tf, loc]=ismember(0.3, 0:0.1:1) % returns false [tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true
Obwohl die Standardtoleranz normalerweise ausreichend sein sollte, bietet sie Ihnen mehr Flexibilität
ismemberf(9.99, 0:10:100) % returns false ismemberf(9.99, 0:10:100,'tol',0.05) % returns true
quelle
Für Gleitkommadaten können Sie die neue
ismembertol
Funktion verwenden , mit der die Satzmitgliedschaft mit einer angegebenen Toleranz berechnet wird . Dies ähnelt derismemberf
Funktion im Dateiaustausch, ist jedoch jetzt in MATLAB integriert. Beispiel:>> pi_estimate = 3.14159; >> abs(pi_estimate - pi) ans = 5.3590e-08 >> tol = 1e-7; >> ismembertol(pi,pi_estimate,tol) ans = 1
quelle