WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Vergleich 2er Matrizen mit einem Vektor

 

surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2011, 13:09     Titel: Vergleich 2er Matrizen mit einem Vektor
  Antworten mit Zitat      
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:

lat:
34.9170000000000 34.9170000000000 34.9170000000000
34.7500000000000 34.7500000000000 34.7500000000000
34.5830000000000 34.5830000000000 34.5830000000000
34.4170000000000 34.4170000000000 34.4170000000000
34.2500000000000 34.2500000000000 34.2500000000000
34.0830000000000 34.0830000000000 34.0830000000000

lon:
-10.4170000000000 -10.2500000000000 -10.0830000000000
-10.4170000000000 -10.2500000000000 -10.0830000000000
-10.4170000000000 -10.2500000000000 -10.0830000000000
-10.4170000000000 -10.2500000000000 -10.0830000000000
-10.4170000000000 -10.2500000000000 -10.0830000000000
-10.4170000000000 -10.2500000000000 -10.0830000000000


Die dritte Komponente ist ein Vektor mit einer ID-Nummer und lat/lon-Pärchen, die nur teilweise in den obengenannten Matrizen vorkommen.

LATLON:

1 34.2500000000000 -10.4170000000000
2 34.0830000000000 -10.2500000000000
3 34.0830000000000 -10.0830000000000

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
   
zw(n,1)=testlat(m,o)
zw(n,2)=testlon(m,o)

 a(n,:)=ismember(zw(n,:),LATLON);
 
 if a==0
     testlat(o,m)=NaN
     testlon(o,m)=NaN
end
end


HILFE!?!? Smile


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.10.2011, 13:55     Titel: Re: Vergleich 2er Matrizen mit einem Vektor
  Antworten mit Zitat      
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)" ?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 07.10.2011, 13:56     Titel:
  Antworten mit Zitat      
Hallo surfer,
anbei ein Vorschlag von mir, wie man das lösen könnte.

Du kannst immer nur 2 Variablen miteinander vergleichen, somit musst du die Matrizen zusammen fassen.
Code:

values = [10, 11, 12;13, 14, 15;16, 17, 18];
values_2 = [19, 20, 21;22, 23, 24;25, 26, 27];
values_3 = [1, 10, 19;2, 14, 23;3, 18, 27];

values_reshaped = [reshape(values,[],1), reshape(values_2,[],1)];
[truefalse, locations] = ismember(values_3(:,2:3), values_reshaped, 'rows');
 

Somit hast du in der variablen "locations" deine Indexwerte bezüglich der Variable "values_reshaped"

Hoffe das hilft dir weiter.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2011, 14:58     Titel:
  Antworten mit Zitat      
nicht ganz,

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: ---
     Beitrag Verfasst am: 07.10.2011, 15:45     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 08.10.2011, 09:33     Titel:
  Antworten mit Zitat      
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".
 
surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2011, 12:37     Titel:
  Antworten mit Zitat      
Hi,

ich habs selber rausbekommen:

Code:

for m=1:3; %Spalten
    for n=1:6; %Zeilen
     
    zw(1,1)=testlat(n,m);
    zw(1,2)=testlon(n,m);

    [truefalse, location] = ismember(zw(1,:), LATLON(:,2:3), 'rows');
   
    if truefalse==0;
        s(n,m)=NaN;
    else
        s(n,m)=LATLON(location,1);

    end
    end
end


das macht jetzt zwar, was ich möchte, dauert aber ziemlich lang! Gibts da noch ein Weg zum Zeitsparen??!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.10.2011, 13:06     Titel:
  Antworten mit Zitat      
Hallo surfer,

Code:

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)));
     if length(match) == 1
       s(n, m) = match;
     elseif length(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:
Code:
x = [];
for i = 1:1000
  x(i) = 5;
end

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
Private Nachricht senden Benutzer-Profile anzeigen
 
surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2011, 14:40     Titel:
  Antworten mit Zitat      
Hi Jan,

danke für den Vorschlag. Funktioniert auch super! Preallocating hatte ich auch schon gemacht.
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.