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

Teilmatrix mit Kriterien ausgeben lassen

 

Alpha23
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2009, 13:40     Titel: Teilmatrix mit Kriterien ausgeben lassen
  Antworten mit Zitat      
Hallo!

Bevor irgendwer sofort eine vermeintliche Lösung postet:
KEINE SCHLEIFEN!!!
Einige scheinen das nur mit so einer Meldung davor zu verstehen. Natürlich nichts gegen die Nutzer, die sich tatsächlich die Frage erst KOMPLETT durchlesen, dann auch noch ÜBERLEGEN und dann erst posten Wink
Sollte das Problem wirklich nicht ohne Schleifen lösbar sein, dann bitte auch nur diese Info posten, weil das kann ich ja.

Ich suche eine Möglichkeit, eine Matrix anhand von Kriterien auszudünnen.
Was vorliegt:
- Matrix A, Größe n x 2
- eine Matrix MAX_A, die für jeden der unterschiedlichen Werte aus der ersten Spalte ein Maximum festlegt
Was ich brauche:
eine Matrix A_neu, die nur die Zeilen enthält, für die der Eintrag der rechten Seite dem Kriterium entspricht, das unter dem Index aus der ersten Spalte steht.
Beispiel:
Code:
>> A=
    1 100
    5 26
    2 46
    2 87
    1 46
    3 10
    4 156
    5 16
    4 65

MAX_A=
    80
    35
    50
    76
    17

Was ich brauche:
Code:
A_neu=
    2 46
    1 46
    3 10
    5 16
    4 65

A_neu enthält nur noch die Zeilen aus A, die in der zweiten Spalte nicht über dem Maximum aus MAX_A liegen.

Danke für eure Vorschläge OHNE SCHLEIFEN!
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 03.06.2009, 15:00     Titel:
  Antworten mit Zitat      
Hi wenn ich dich richtig verstanden habe müsste es so gehen:

Code:

A(A(:,2)-MAX_A(A(:,1))<=0,:)
 


Aber dein Beispiel ist glaube ich etwas fehlerhaft. Der erste Wert sollte nicht im Ergebnis stehen. Oder?

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Alpha23
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2009, 15:51     Titel:
  Antworten mit Zitat      
Argh, natürlich! Das, was ich die ganze Zeit sowieso mache...

Vielen Dank! =)

Was mich allerdings wundert: Wenn ich das Aussortieren per Schleife mache, dann geht's viel schneller! Warum? Hat das was damit zu tun, dass MATLAB dann nicht die Differenz berechnen muss? Ist jedesmal ein Vektor mit knapp 20.000 Einträgen.
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 03.06.2009, 16:24     Titel:
  Antworten mit Zitat      
Ja stimmt,

man könnte ja auch einfach größer als, statt minus nehmen, dann sollte es schneller gehen, also:

Code:

A(A(:,2)>MAX_A(A(:,1))<=0,:)
 


Grüße,

derOli
Private Nachricht senden Benutzer-Profile anzeigen
 
Alpha23
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2009, 16:47     Titel:
  Antworten mit Zitat      
Richtig. Oder auch
Code:
A(A(:,2)>MAX_A(A(:,1)),:)

Der Vektor, der die Zeilen abruft ist ja schon logical.
Trotzdem ist die Schleife aus unerfindlichen Gründen schneller... Die läuft durch die Anzahl der unterschiedlichen Einträge der ersten Spalte von A und hängt die passenden Zeilen an die Ausgabe ran. Vom Gefühl her hätte ich gesagt, dass das länger dauern würde.
Private Nachricht senden Benutzer-Profile anzeigen
 
Alpha23
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2009, 18:06     Titel:
  Antworten mit Zitat      
Besser zu verstehen ist das Ganze, wenn's in A noch eine dritte Spalte gibt mit nur unterschiedlichen Werten, die man sich ausgeben lassen will nach dem Kriterium von vorne.
Hintergrund kommt aus der Graphentheorie: A ist eine Liste, die jedem Knoten eines Graphen (letzte Spalte) ein Cluster (erste Spalte) und eine Zeit (zweite Spalte) zuordnet. Jetzt soll von einem Knoten aus eine Graphensuche gestartet werden, ohne dass Knoten erreicht werden, die ein zeitliches Maximum für das jeweilige Cluster, dem sie angehören, überschritten wird. In der Liste sollen alle Knoten stehen, die aussortiert werden müssen.
Nach längerem Rumprobieren hat sich eine Schleife letztlich als die schnellste Alternative ergeben:
Code:
outsorted=[];
new=[];
for i=1:length(MAX_A)
   new=[new,A(A(A(:,1)==i,2)>MAX_A(i),3)];
end
outsorted=union(outsorted,new);
 

Irgendwie fasziniert mich das...
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2024 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.