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

Suche die kleinsten 4 Werte in einem Vektor

 

nic

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2011, 16:36     Titel: Suche die kleinsten 4 Werte in einem Vektor
  Antworten mit Zitat      
Hallo,

ich suche einen Weg, wie man die 4 kleinsten Werte eines Vektors findet OHNE sortieren.
Ist bestimmt ganz leicht, aber ich steh da grad auf dem Schlauch!


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.12.2011, 16:44     Titel:
  Antworten mit Zitat      
Also Sortieren wäre in diesem Fall günstiger, sonst muss du 4 Mal MIN anwenden.
so:
Code:

A          = round(rand(1,100)*100);

min_val = zeros(1,4);
B= A;
for k=1:length(min_val)
   [min_val(k), idx]= min(B);
   B(idx)=NaN;
end
min_val

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.12.2011, 19:05     Titel: Re: Suche die kleinsten 4 Werte in einem Vektor
  Antworten mit Zitat      
Hallo nic,

Zitat:
ich suche einen Weg, wie man die 4 kleinsten Werte eines Vektors findet OHNE sortieren.

Du kannst beruhigt sein: Das geht nicht.

Die vier kleinsten Werte zu suchen ist nämlich bereits eine Sortierung, wenn auch nur eine partielle. Oder meinst ohne den SORT-Befehl zu verwenden?

Bei einem großen Array ist der viermalige Aufruf von MIN übrigens schneller als das gesamte Array zu sortieren. Es gibt noch einen einfachen Ansatz mit einer FOR-Schleife. Man startet mit m=[Inf, Inf, Inf, Inf] und wenn des gerade betrachtete Element x(i) kleiner ist als m(1), ersetzt man m durch [x(i), m(1:3)].

Ich meine, dieser allgemeine Beschreibung zu folgen wäre keine Täuschung bei der Abgabe einer Hausaufgabe.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.12.2011, 00:49     Titel:
  Antworten mit Zitat      
Habe ich wieder eine Hausaufgabe gelöst?
Private Nachricht senden Benutzer-Profile anzeigen
 
razmatazz.guest

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2013, 15:54     Titel:
  Antworten mit Zitat      
Ich suche gerade ebenfalls nach einer Möglichkeit, die x kleinsten Elemente in einer Matrix/Vektor zu finden (keine Hausaufgabe Wink ).

Was ist mit "mehrmaligem Anwenden von min" gemeint?
Müsste man dazu das zuletzt gefundene Minimum durch eine "hohe" Zahl (oder NaN) ersetzen, und dann auf die veräünderte Matrix/Vektor nochmals min anwenden?
Oder kennt ihr da eine elegeante Lösung /meint mit der Aussage etwas anderes?

Sortieren möchte ich auch eher ungern, wobei ich damit vermutlich mit weniger wurstigen Nebenrechnungs-Code-Zeilen auskäme.

Viele Grüße,
Christoph
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.06.2013, 00:13     Titel:
  Antworten mit Zitat      
Hallo razmatazz.guest,

Eine effiziente Antwort lässt sich nur geben, wenn Du erklärst, wie viele Elemente Du aus wie vielen Zahlen finden möchtest. Das sieht bei 2 aus 1e5 ganz anders aus als bei 1e5 aus 1e6.

Meine Idee von 2011 war:
Code:
x = rand(1, 1000);
[value1, index1] = min(x);
x(index1) = NaN;
[value2, index2] = min(x);

Oder in einer Schleife:
Code:
n = 17;
value = zeros(1, n);
for k = 1:n
  [value(k), index] = min(x);
  x(index) = NaN;
end

Sieht also eigentlich nicht kompliziert aus, oder?

Aber ab einer gewissen Größe, ist dies einfach schneller:
Code:
xs = sort(x);
value = xs(1:17);


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
razmatazz.guest

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2013, 17:24     Titel:
  Antworten mit Zitat      
Guten Tag,

danke für die Antwort, ich habe mich relativ zeitnah für die sort Lösung entschieden. Mir ist selber aufgefallen, dass wenn es keinen Befehl dafür gibt, es nur über setzen auf NaN funktionieren kann, wie die bereits gepostete Lösung.

Das Problem ist im Verhältnis zu deinen Größenordnungen viel kleiner.

Der zu durchsuchende Vektor ist 20-100 Einträge groß, und die zu findenen Werte ebenfalls in diesem Bereich (worst case: soviele wie der Vektor lang ist).
Ich vermute da ist man mit dem sort Befehl schneller.

Aber ist auch nur ein kleines Detail und die Performance ist dort nicht wichtig. Ich war eher auf der Suche nach einem sehr schlanken Code.

Viele Grüße,
Christoph
 
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.