Gibt es eine eingebaute MATLAB-Funktion, um herauszufinden, ob eine Matrix einen bestimmten Wert enthält? (ala PHPs in_array()
)
Gibt es eine eingebaute MATLAB-Funktion, um herauszufinden, ob eine Matrix einen bestimmten Wert enthält? (ala PHPs in_array()
)
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)
any
. Aber vielleicht möchten Sie das selbst messen (mit tic
und toc
).
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)
A
jeden dieser Werte enthält (z. B. die [true, true, false]
Bedeutung A
enthält die Werte 5
und 7
nicht 11
).
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
Für Gleitkommadaten können Sie die neue ismembertol
Funktion verwenden , mit der die Satzmitgliedschaft mit einer angegebenen Toleranz berechnet wird . Dies ähnelt der ismemberf
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