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

grösste Werte

 

Tolpatsch
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2009, 17:31     Titel: grösste Werte
  Antworten mit Zitat      
Hallo zusammen
ein kleines Problem: wie kann ich die 10 grössten Werte aus einem 1*500 zeilenvektor herausfinden?
Danke für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 27.05.2009, 18:11     Titel:
  Antworten mit Zitat      
Moin,

eine schnelle Lösung:
Code:
a = rand(1,500)*10;
maxwerte = zeros(1,10);
for k=1:10
    maxwerte(k) = max(a);
    a(a==max(a)) = [];
end


Das funktioniert aber nur so lange keine doppelten Werte auftauchen.

Gruß
Alex

/edit: Danke an denny für den Hinweis auf meinen Fehler Wink
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?

Zuletzt bearbeitet von steve am 27.05.2009, 19:35, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 27.05.2009, 18:42     Titel:
  Antworten mit Zitat      
@Steve
kleiner Fehler eingeschlichen

Code:

a = round(rand(1,500)*10);
maxwerte = zeros(1,10);
for k=1:10
    [maxwerte(k),pos] = max(a);
    a(pos) = [];
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Tolpatsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2009, 18:44     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hilfe!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Tolpatsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2009, 18:56     Titel:
  Antworten mit Zitat      
Gibts eine Möglichkeit herauszufinden an welcher Stelle die grössten Werte liegen?
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 27.05.2009, 19:35     Titel:
  Antworten mit Zitat      
@ Tolpatsch: Ja, über den Aufruf von MAX wie bei denny:
Code:
[groesster, position] = max(a);


@denny: Eigentlich sollte es so heißen:
Code:
a(a==max(a)) = [];


Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Tolpatsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2009, 19:40     Titel:
  Antworten mit Zitat      
Thank you guys!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Tolpatsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2009, 11:38     Titel:
  Antworten mit Zitat      
Ich habe versucht die ganze Geschichte auf eine Matrix auszuweiten, d.h. ich suche die 5 grössten Werte jeder Zeile einer 10*500 Matrix.

Code:

a = round(rand(10,500)*10);
maxwerte = zeros(10,5);
for i=1:10
    for k=1:5
        [maxwerte(i,k),pos] = max(a(i,k));
        a(pos) = [];
    end
end
 


Leider bekomme ich immer wieder die gleiche Fehlermeldung (Index exceeds matrix dimensions). Kann mir jemand weiterhelfen?
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 02.06.2009, 15:13     Titel:
  Antworten mit Zitat      
Moin,

dann schau dir nochmal die Hilfe zu der MAX-Funktion an. Du kannst nämlich die Dimension übergeben, in welcher das Maximum gesucht werden soll. Wink

Gruß
Alex

PS: Die Lösung benötigt nur eine Schleife Wink
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Tolpatsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2009, 16:35     Titel:
  Antworten mit Zitat      
Hej irgendwie gelingt es mir nicht die Elemente in maxvalues haruaszukicken, damit ich keine doppelten einträge habe. Ich habe es wie folgt versucht:
Code:

tmp = rk';
maxvalues = zeros(5,10);
pos=zeros(5,10);
for k=1:5
    [maxvalues(k,:),pos(k,:)] = max(tmp);
    tmp(pos(??????) = [];
end
 

Leider weiss ich nicht wie ich das Problem mit pos lösen soll. Versucht habe ich folgende Varianten:
Code:

pos(k,:)=[];
pos(:,k)=[];
pos(k)=[];
 

wobei keine num Erfolg führte...
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 02.06.2009, 16:55     Titel:
  Antworten mit Zitat      
Code:
a = rand(10,500)*10;
maxwerte = zeros(10,5);
for k=1:5
    [maxwerte(:,k),pos] = max(a,[],2);
    a(:,pos) = [];
end


Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Tolpatsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2009, 08:18     Titel:
  Antworten mit Zitat      
Danke Alex!! Du scheinst dich ziemlich auszukennen mit Matlab, kennst du gute Literatur (evtl. in Verbindung zu Finance Applikationen) zu Matlab?

Gruss und Dank!!
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 03.06.2009, 08:56     Titel:
  Antworten mit Zitat      
Leider nein.

Was ich empfehlen kann:
1. Matlab Hilfe ausgiebig nutzen.
2. mitgelieferte Demos anschauen, bzw. durcharbeiten
3. Mathworks Webinare ansehen (da gibts auch jede Menge zu Finace Applications)

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Alpha23
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2009, 13:10     Titel:
  Antworten mit Zitat      
Bei den vielen Schleifen wird einem ja schlecht!

Generell sollte man Schleifen in MATLAB vermeiden wo's nur geht! Die lassen nämlich nicht nur die Laufzeit explodieren, sondern machen den Quelltext sehr schnell unübersichtlich! Außerdem: Variablen vermeiden, wo's geht, damit der Speicher nicht überfüllt wird. Das hat nichts mit Schönheit zu tun, sondern mit (An-)Gewöhnungssache. Ich hab' früher auch laufend Schleifen verwendet und gar nicht gemerkt, wie langsam Alles läuft. Als ich dann angefangen hab', Schleifen zu sparen, gab's Laufzeitverbesserungen von teilweise mehreren Hundert Prozent!

Hier ein Vorschlag für die k größten Werte eines Vektors v OHNE SCHLEIFEN und mit nur einer Zwischenvariable (vorher k festlegen):

Code:
output=unique(v); % alle verschiedenen Werte in absteigender Reihenfolge
output=output(end-k:end); % reduzieren auf die k größten Werte

Die Funktion
Code:

gibt die unterschiedlichen Werte eines Vektors oder einer Matrix aus, lies mal in der Hilfe nach, das kann noch mehr. Bitte keine Schleife aus nem einfachen Befehl machen!
Für die Indizes und Werte aus v, die dem Kriterium entsprechen, kannst du z.B. noch ein
Code:
output=[find(ismember(v,output)),v(ismember(v,output))];

dahinterhängen. Die erste Spalte enthält die Indizes aus v, unter denen ein Eintrag steht, der zu den k größten Werten gehört, die zweite Spalte dann die Werte selbst. Für Matrizen geht das ähnlich, aber da brauchst du zwei Zwischenvariablen mehr. Aber auch hier: KEINE SCHLEIFE benötigt!

Viel Erfolg bei der weiteren Programmierung!

Zuletzt bearbeitet von Alpha23 am 03.06.2009, 18:12, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Alpha23
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2009, 17:08     Titel:
  Antworten mit Zitat      
Danke an derOli erstmal!!! Very Happy

Habe mich belehren lassen, dass das mit den Schleifen so nicht stimmt. Wichtiger ist, dass MATLAB möglichst kleine Variablen zum Bearbeiten bekommt. Also häppchenweise. Das gilt auch für die (logischen) Anweisungen, die innerhalb von Vektoren stehen (meinetwegen: zeige mir alle Werte des Vektors, die größer sind als 30).
Eine for-Schleife kann durchaus lohnen, wenn bei sehr große Datenmengen an nur wenigen Stellen geändert werden müssen. Durch die Vektorisierung muss MATLAB die gesamte Variable laden, bei der for-Schleife nur kleine Teile. Außerdem kann man mit einer if-Prüfung verhindern, dass während der Schleife irrelevante Teile der Daten überhaupt prozessiert werden.

Hoffe mal, dass das so stimmt... Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.