Verfasst am: 07.10.2011, 13:09
Titel: Vergleich 2er Matrizen mit einem Vektor
Hallo,
Ich grübel schon seit 1.5 Tagen über einem Problem:
Ich habe 2 Matrizen mit Daten über geografische Länge und geografische Breite.Spalten und Zeilenanzahl der beiden sind identisch. Das sieht in etwa so aus:
meine Frage: Wie vergleiche ich 3 verschiedene Komponenten miteinander und sehe dann an welcher Stelle sich die vorhandenen Wertepaare in den beiden Matrizen befindet?!
ich habs zunächst mit einer zwischenvariable versucht, die sich die Werte aus lat und lon heraussucht und dann mit LATLON per ismember vergleicht. Das funzt aber irgendwie nicht.
Code:
for n=1:18 %Gesamtanzahl Werte in einer Matrix
m=1:3 %Spalten lat und lon
o=1:6 %Zeilen lat und lon
Verfasst am: 07.10.2011, 13:55
Titel: Re: Vergleich 2er Matrizen mit einem Vektor
Hallo surfer,
Ich verstehe die Frage nicht.
Was genau bedeutet "Das funzt aber irgendwie nicht."? Gibt es eine Fehlermeldung oder weicht das Ergebnis von Deinen Erwartungen ab?
Nach "a(n,:)=ismember(zw(n,:),LATLON);" ist ein Vergleich "if a==0" nicht sehr stabil - meinst Du "all(a(:))" oder "any(a(:)==0)" ?
meine Outputmatrix soll so aufgebaut sein wie die beiden Matrizen LAT und LON. Diese soll NaN bzw. die gefundene ID beinhalten. also quasi so:
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
1 NaN NaN
NaN 1 1
Ich erhalte mit dem Code da unten nicht das gewünschte Ergebnis. Ich vermute mit den 3 Laufindizes geht was schief?!
Kann man die 3 "Dimensionen" (also Gesamtanzahl, Spalten, Zeilen) so gleichzeitig laufen lassen?
surfer
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.10.2011, 15:45
Titel:
edit:
Natürlich soll das Ergebnis so aussehen:
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
1 NaN NaN
NaN 2 3
surfer
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.10.2011, 09:33
Titel:
Weiß denn keiner wnigstens eine Richtung zum Ergebnis? Ich hab gestern und heute noch bisschen probiert, aber ich bekomme es einfach nicht hin, dass die Schleifenkonstruktion die beiden Felder richtig "abtastet".
s = NaN(6, 3); % Pre-allocate!!! for m=1:3 %Spalten
for n=1:6 %Zeilen % Kein Semicolon nötig nach FOR
zw1 = testlat(n,m);
zw2 = testlon(n,m);
match = LATLON(and(LATLON(:, 2) == zw1, LATLON(:, 3) == zw2)));
iflength(match) == 1
s(n, m) = match;
elseiflength(match) > 1 error('??? more than 1 match???');
end end end
Dies ist deutlich schneller. Die Pre-allocation ist extrem wichtig, da sonst das Array "s" in jeder Iteration wächst. Dann muss Matlab jedesmal Speicher für ein neues Array reservieren und die alten Werte kopieren. Für ein Array der Größe [6 x 3] ist das nicht tragisch. Aber der Aufwand wächst exponentiell:
Insgesamt müssen SUM(1:1000) * 8 Bytes alloziert werden, also 4004 kB, obwohl x selbst am Schluß nur 8 kB benötigt.
ISMEMBER('rows') ist nicht sehr effizient, da es in jeder Iteration die Daten neu sortiert. Das "logical indexing" in meinem Beispiel ist deutlich schneller.
Gruß, Jan
surfer
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.10.2011, 14:40
Titel:
Hi Jan,
danke für den Vorschlag. Funktioniert auch super! Preallocating hatte ich auch schon gemacht.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.