Vektoren in Matlab

Neue Frage »

mthe Auf diesen Beitrag antworten »
Vektoren in Matlab
Hallo!
ich brauche hilfe bei matlab! ich soll die maximalen elemente eines vektors bzw die stellen ermitteln, die ich dann brauche um spalten einer matrix auszuwählen! ich weiß wie ich "das" maximum und die zugehörige stelle bestimmen kann, nicht aber wie man mehrere stellen davon bestimmt! hab da an eine "for"-schleife gedacht!
kann mir da jemand weiterhelfen?!
vielen dank im voraus
mthe Auf diesen Beitrag antworten »
RE: Vektoren in Matlab
ich habe jetzt selbst eine idee weiß nur nicht so recht wie ich das programmieren soll, vielleicht kann mir da jemand weiterhelfen?! ich bestimme zunächst das maximum des vekrors und die zugehörige stelle! dann setze ich diese stelle =0 in dem vektor, bestimme dann das nächste maximum usw bi ich die m stück habe! als ausgabe brauche ich eine vektor mit den stellen, welche ich dann weiterverwenden möchte! ich habe bisher folgendes:

for i=1:n;
[y,j] = max(xk);
xk(i)=0;
end

weiß aber nicht so recht ob das so stimmt?!
vielen dank im voraus!
 
 
Mazze Auf diesen Beitrag antworten »

Wenn ich das richtig verstehe hast Du einen Vektor v der mehrere maximale Elemente hat und Du willst die Stellen finden an denen sie auftreten?
mthe Auf diesen Beitrag antworten »

ja genau so! diese stellen brauche ich dann um von einer matrix diese spalten auszuwählen!
Mazze Auf diesen Beitrag antworten »

Eine ganz banale Lösung wäre , das Maximum des Vektors zu berechnen, und dann einfach eine Schleife durchlaufen lassen und vergleichen also im Pseudo Code :


code:
1:
2:
3:
4:
5:
6:
7:
8:
a = max(v);
for i = 1:length(v)
  if v(i) == a
    index i merken;
  end
end


Das ist natürlich semioptimal da man das Ganze auch mit nur einem Schleifendurchgang packt. Dann muss man aber immer eine Liste von Indizes anpassen (eigentlich nur neue Indizes hinzufügen oder Liste komplett neu machen wenn ein neues Maximum gefunden wurde).
mthe Auf diesen Beitrag antworten »

aber das gibt mir nur eine stelle aus oder?!ich bestimme ja einmal das maximum, dann wird die stelle dazu ausgegeben! wie kann ich das machen dass es mehrere sind?!
Mazze Auf diesen Beitrag antworten »

Zitat:
aber das gibt mir nur eine stelle aus oder?


Da hast Du meinen Pseudocode wohl nicht verstanden. Die Idee ist es erst das Maximum zu bestimmen, und dann jeden Eintrag des Vektors v mit diesem Maximum zu vergleichen. Sind sie gleich, wird sich der Index gemerkt.

edit :

Kurze Frage, sind alle Maxima gleich oder suchst Du die k <= n größten Elemente des Vektors?
mthe Auf diesen Beitrag antworten »

sie sind nicht gleich! ich such die m, wobei das m kleiner ist als die länge des vektors, also so wie du das geschrieben hast, größten elemente des vektors! wenn ich z.b den vektor [1;6;3;4] habe, möchte ich dass mir die stelle der 6 und die der 4 ausgegeben wird!
Mazze Auf diesen Beitrag antworten »

Das ist natürlich dann etwas anders zu lösen. Sei v der entsprechende Vektor und w ein ektor der die Indizes von v enthält, also




Sortiere dann den Vektor v aufsteigend (oder absteigend - ist egal) mit einem Algorithmus der auf Vertauschen beruht (etwa Bubble Sort, Quick Sort usw.). Bei jedem Vertauschungsschritt vertausche auch die entsprechenden Einträge des Vektors w. Am Ende hast Du einen sortierten Vektor v und einen neuen Vektor w. Die ersten m Einträge des Vektors v (oder die Letzten, je nach dem wie du sortiert hast) sind dann die größten Elemente, und die ersten m Elemente des Vektors w (bzw. die letzten m) sind die zugehörigen Indizes.
mthe Auf diesen Beitrag antworten »

das hört sich kompliziert an! was sagst du denn zu meiner überlegung?! also das ich erst das maximum mit der zugehörigen stelle mir ausgeben lass, dann diesen eintrag gleich nulll setze, dann wieder das maximum bestimmt, mit der stelle, diesen eintrag wieder gleich null setze usw, und diese stellen in einem vektor abspeicher?
Mazze Auf diesen Beitrag antworten »

Zitat:
das hört sich kompliziert an! was sagst du denn zu meiner überlegung?! also das ich erst das maximum mit der zugehörigen stelle mir ausgeben lass, dann diesen eintrag gleich nulll setze, dann wieder das maximum bestimmt, mit der stelle, diesen eintrag wieder gleich null setze usw, und diese stellen in einem vektor abspeicher?


Wenn dein Vektor Einträge hat die alle größer als Null sind geht das. Bei einem Vektor der nur Negative Werte hat schlägt das sofort fehl.
mthe Auf diesen Beitrag antworten »

stimmt, aber wenn alle größer als null sind, macht dann das was ich oben geschrieben hab, das was ich will?!
Mazze Auf diesen Beitrag antworten »

Der Code den Du gepostet hat, setzt von Begin an, der Reihe nach die Einträge des Vektors null. Das was Du meinst ist

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 

for i=1:n

  [y,j] = max(xk); 

  index j merken;

  xk(j)=0; 

end


(also einfach an einer Stelle das i durch ein j ersetzen)

Diese Schleife würde die ersten n Maxima des Vektors xk bestimmen und sich "merken". Das merken musst Du natürlich selbst machen. (Liste oder so).
mthe Auf diesen Beitrag antworten »

stimmt, dahab ich mich mit dem index vertan! vielen dank für die Hilfe!
mthe Auf diesen Beitrag antworten »

es läuft und es macht was es soll! vielen dank für die hilfe, hab da noch eine kleine frage: mit diesen indizes will ich aus einer matrix die zugehörigen spalten rausnehmen und ne neue matrix bilden! habe diesen vektor p genannt! wenn ich jetzt die spalten aus einer matrix haben möchte geht das dann so?!

B=A(:,p(i))
Mazze Auf diesen Beitrag antworten »

Zitat:
wenn ich jetzt die spalten aus einer matrix haben möchte geht das dann so?!


Probiers doch einfach aus smile . Du kannst ja einfach mal in die Matlabkommandozeile (nich in den Quelltext) A = rand(4,4) oder so eingeben. Danach ruf mal A(:,1) auf, dann siehste schon was passiert.
mthe Auf diesen Beitrag antworten »

Also das funktioniert nicht, er gibt mir die spalten einzeln aus und fügt sie nicht zu einer matrix zusammen! muss dann mal weiter probieren.
mthe Auf diesen Beitrag antworten »

hab schon alles mögliche ausprobiert! ich weiß wie ich das bei ner matrix mache, wenn ich zum beispiel zwei spalten will! ich will aber die einträge aus diesem vektor benutzen und krieg das nicht so hin!
mthe Auf diesen Beitrag antworten »

ich hab es jetzt! ich durfte einfach keine for-schleife benutzen, mußte also setzen:
B=A(:,p), wobei p der vektor war der die stellen der maximalen werte des vektors speichert!
mthe Auf diesen Beitrag antworten »

jetzt hab ich aber ein weiteres problem: und zwar will ich die anderen einträge auch in einen vektor abspeichern...
mthe Auf diesen Beitrag antworten »

hat sich erledigt, habs wahrscheinlich etwas umständlich gemacht, aber es funktioniert...
breakp Auf diesen Beitrag antworten »

hallo
ich habe das gleiche problem! dies hat mir also sehr geholfen!
allerdings weiss ich nciht wie das mit dem "merken/liste" geht.
er merkt sich immer nur die stelle an der die max sind aber nicht ihren wert!
hoffe ihr koennt mir helfen! :-S :-)
breakp Auf diesen Beitrag antworten »

eigentlich loest sich mein eingentliches problem doch leider nicht damit.
vll hat jmd ja eine idee dafuer:
und zwar habe ich einen vektor von werten die "wellenfoermig" verlaufen.
jetzt brauche ich von jeder welle den obersten wert!
das wird mit der vorigen version nicht gehen, weil er dann die nachbar werte der welle findet. die wellen sind nciht gleichmaessig. manche sind kleiner aber auch von denen brauche ich den obersten wert.
waere echt top wenn jmd auch nur nen ansatz oder annaehernde loesung hat!

vg breakp
Mazze Auf diesen Beitrag antworten »

Wenn die Daten äquidistant sind, d.h jedes Maximum an der k-fachen Stelle des Vektors steht kannst Du es direkt indizieren. Ansonsten ist eine Möglichkeit folgende :

Untersuche immer Triples . Dann ist ein lokales Maixmum wenn

So kannst Du einmal den Vektor entlang gehn und hast jeweils die Maxima. Wenn Du allerdings Rauschen auf den Daten hast kann das schiefgehn.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »