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

Matix mit mehreren y-Werten zu einen x-Wert, suche y_max(x)

 

Hans Maulwurf
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2010, 15:00     Titel: Matix mit mehreren y-Werten zu einen x-Wert, suche y_max(x)
  Antworten mit Zitat      
Hallo,

ich habe eine Matrix die so ähnlich aussieht:

x y1 y2 y3
0 0,5 0,2 0,6
0 0,4 0,3 0,5
0,1 0,7 0,8 0,1
0,1 0,1 0,7 0,2
0,12 0,3 0,4 0,1
0,2 0,7 0,1 0,7
0,3 0,5 0,2 0,6
0,3 0,2 0,5 0,8
0,35 0,2 0,5 0,8

Ich suche jetzt von jedem x-Werte die maximalen Werte für y1, y2 y,3

In meinem Beispiel wären das also

y1_max(x=0) = 0,5
y2_max(x=0) = 0,3
y3_max(x=0) = 0,6

y1_max(x=0,1) = 0,7
y2_max(x=0,1) = 0,8
y3_max(x=0,1) = 0,2

y1_max(x=0,12) = 0,3
y2_max(x=0,12) = 0,4
y3_max(x=0,12) = 0,1

.... und so weiter.

Meine Frage ist, wie kann ich dies am intelligentesten mit MATLAB lösen?

Vielen Dank.

Gruß[list=][/list]
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.06.2010, 15:18     Titel:
  Antworten mit Zitat      
Hallo

ich würde UNIQUE über X-Werte machen

Code:
x_un = unique(Matrix(:,1))


Dann y1_max / y1_max/y3_max vorinitialisieren
dann in FOR-Schleifen Max -Werte suchen und Max-Arrays ausfüllen

Code:

y1_max= zeros(size(x_un));
y2_max= zeros(size(x_un));
y3_max= zeros(size(x_un));
for k=1:length(x_un)

   y1_max(x_un==x_un(k)) = max(Matrix(Matrix(:,1)==x_un(k),2))
   y2_max(x_un==x_un(k)) = max(Matrix(Matrix(:,1)==x_un(k),3))
   y3_max(x_un==x_un(k)) = max(Matrix(Matrix(:,1)==x_un(k),4))

end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Hans Maulwurf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2010, 12:38     Titel:
  Antworten mit Zitat      
Hallo,

danke erstmal für die schnelle Hilfe. Leider funktioniert dein Ansatz nicht so richtig. Matlab rechnet eine Ewigkeit vor sich hin so dass ich den Vorgang abbrechen musste. Liegt vielleicht an der Größe der Ausgangsmatrix (39985 x 4).

Ich habe das Programm jetzt auch mal in einer anderen Hinsicht angepasst und zwar so, dass die Ergebnisse alle wieder in eine Matrix geschrieben werden, die wie folgt aufgebaut ist (x, y1_max(x), y2_max(x) y3_max(x))

Code:

clear all
clc

format long
M = csvread('5mm.csv')

x_un = unique(M(:,1))

y_max= zeros(size(x_un),4);
for k=1:length(x_un)
    for i=2:4
        y_max(x_un==x_un(k)) = max(M(M(:,i)==x_un(k),i))
    end
end

 


Leider bricht hier das Programm mit folgender Meldung ab.

??? Improper assignment with rectangular empty matrix.

Error in ==> proggi at 12
y_max(x_un==x_un(k)) = max(M(M(:,i)==x_un(k),i))

Wo ist mein Fehler?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 22.06.2010, 13:20     Titel:
  Antworten mit Zitat      
Hallo
Nee Zweite Schleife ist nicht notwendig, dass kann MAX-Funktion in einem Schritt schaffen
Dieser Code hat bei mir 2 Sekunden gedauert:
Code:

clear all
clc

format long
M     = round(rand(39985,4)*10000);

x_un  = unique(M(:,1));
y_max = zeros(length(x_un),4);
for k = 1:length(x_un)
        y_max(x_un==x_un(k),:) = max(M(M(:,1)==x_un(k),:),[],1);
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Hans Maulwurf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2010, 13:45     Titel:
  Antworten mit Zitat      
Hey Denny,

DANKE, der letzte Code scheint genau das zu machen, was ich gesucht habe.
Ich habe es mit einer kleinen 10x4 Matrix versucht und es hat funktioniert. Mit der großen Matrix, dauert es jedoch sehr lange. Eine Ende des Durchlaufs scheint nicht in Sicht. Sad

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 22.06.2010, 13:54     Titel:
  Antworten mit Zitat      
Komisch sollte nicht sein, was hast du denn für Rechner und welche Matlab Version verwendest du?
Hallo versuche mal den Code als M-File find_max.m abzuspeichern

Code:

function y_max = find_max()
format long
M     = round(rand(39985,4)*10000);

x_un  = unique(M(:,1));
y_max = zeros(length(x_un),4);
for k = 1:length(x_un)
        y_max(x_un==x_un(k),:) = max(M(M(:,1)==x_un(k),:),[],1);
end
 


Und dann in Profiler die Bremse suchen:
In Matlab Konsole folgendes auszuführen
Code:

profile on;  find_max; profile viewer;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 22.06.2010, 23:50     Titel:
  Antworten mit Zitat      
mein 1,4GHz braucht unter XP und 7.1 etwa 20s...
Private Nachricht senden Benutzer-Profile anzeigen
 
Hans Maulwurf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2010, 14:05     Titel:
  Antworten mit Zitat      
Bei mir lag's daran, dass ich den Laptop im Akkubetrieb und somit reduzierter Leistung genutzt habe. Im Netzbetrieb läuft's wunderbar. Danke nochmal an Denny.

Gruß
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 - 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.