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

Vermeidung meiner for-Schleife

 

stick_thai
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 09:38     Titel: Vermeidung meiner for-Schleife
  Antworten mit Zitat      
Moin zusammen,

ich habe ein Problem mit einer for-Schleife, die ich gerne aus meinem Matlab-Code beseitigen würde. Aber leider weiß ich nicht, wie ich das anstellen soll.
Die Situation ist folgende: Ich habe 2 Vektoren wie folgt:

Zitat:

A = [1;2;4;1;2;4;8;3;1];
b = [8;2];

Dabei ist Vektor b der Indexvektor von A der mir besagt, dass "irgendwo" in der Nähe dieses Index ein lokales Maximum liegen muss (in dem Fall eigentlich bei Index 7 und 3). Leider ist nicht bekannt, ob "irgendwo" 2, 3 oder 4 Indizes weiter bedeutet. Darum habe ich mir eine for-Schleife geschrieben, die von den Indizes im Vektor b nach links und rechts im A-Vektor geht und nach größeren Werten sucht. Das Startmaximum ist der Wert des Indexs in b. Wird rechts oder links ein größerer Wert gefunden, wird in dieser Richtung weiter gesucht. Dies wird in beide Richtungen solange getan, bis die Werte wieder kleiner werden.

Da ich dies nicht nur für ein A-b-Vektorpaar machen muss, sondern sehr häufig, würde ich das gerne eleganter lösen.
Vielleicht kann mir dabei jemand einen Tipp geben?

Danke und Gruß,
stick_thai.
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: 23.09.2010, 11:38     Titel:
  Antworten mit Zitat      
Hallo Stick_thai,

kansst Du Deine FOR-Schleife einfach mal posten?
Es wäre schon notwendig zu wissen, wie groß der zu untersuchende Vektor ist - 2, 3, 4 oder 3000?? Wenn Du das nicht klar einschränkst, ist das Ergebnis der Programms im Grunde zufällig.

Wenn diese Maximal-Wert festgelegt ist, kannst Du aus dem Vektor eine Matrix erstellen, die die jeweiligen Blöcke als Zeilen hat. In dieser Matrix kannst Du dann per DIFF-Befehl nach den lokalen Minima/Maxima suchen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stick_thai
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 13:01     Titel:
  Antworten mit Zitat      
Hi Jan,

also hier wäre die for-Schleife:

Code:
                       add1            = ind;
                        add2            = ind;
                        bbreak1         = false;
                        bbreak2         = false;
                        for m=1:size(korrkoef,1)
                            if false == bbreak1 & ind + m <= size(korrkoef,1)
                                if korrkoef_gauss(ind + m) > korrkoef(add1)
                                    add1 = ind + m;
                                else
                                    bbreak1 = true;
                                end
                            else
                                bbreak1 = true;                        
                            end

                            if false == bbreak2 & ind -  m > 0
                                if korrkoef_gauss(ind - m) > korrkoef(add2)
                                    add2 = ind - m;
                                else
                                    bbreak2 = true;
                                end
                            else
                                bbreak1    = true;                        
                            end                    
                            if true == bbreak1 & true == bbreak2
                                break;
                            end
                        end      


Könntest du mir kurz erklären, was du damit meinst:
Zitat:
Es wäre schon notwendig zu wissen, wie groß der zu untersuchende Vektor ist - 2, 3, 4 oder 3000?


Gruß,
stick_thai
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: 23.09.2010, 13:22     Titel: Re: Vermeidung meiner for-Schleife
  Antworten mit Zitat      
Hallo stick_thai,

Zitat:
Leider ist nicht bekannt, ob "irgendwo" 2, 3 oder 4 Indizes weiter bedeutet.

Es wäre wichtig die maximale Entfernung zu kennen. Heißt "irgendwo" also "maximal 4 Elemente entfernt", oder können es auch 5 oder 100 sein?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stick_thai
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 13:32     Titel:
  Antworten mit Zitat      
Hi Jan,

also mehr als 4 Indizes entfernt wird es mit Sicherheit nicht sein. Es könnte allerdings sein, dass innerhalb dieser Entfernung ein Wert liegt, der höher ist, z.B. gerade in 4 Indizes Entfernung. Dazwischen allerdings gibt es einige Werte, die wiederum niedriger als der mit dem ursprünglichen Index angegebene Wert liegt. Darum bringt eine einfache Maximasuche jeweils 4 nach rechts und links keinen Erfolg.

Gruß,
stick_thai
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: 23.09.2010, 14:31     Titel:
  Antworten mit Zitat      
Hallo stick_thai,

dann fasse ich mal zusammen, was ich bisher verstanden habe:
Code:

x = rand(1, 9);  % Test daten
% So starten, dass links und rechts 4 Elemente vorhanden sind:
if x(6) >= x(5)  % Gehe nach rechts, wenn es größer wird
  if x(7) < x(6)
     % Reply x(7)
  elseif x(8) < x(7)
     % Reply x(8)
  else
     % Reply x(9)
  end  
else  % Gehe nach links, wenn x(6) < x(5)
  if x(4) < x(5)
     % Reply x(5)
  elseif x(3) < x(4)
     % Reply x(4)
  elseif x(2) < x(3)
     % Reply x(3)
  elseif x(1) < x(2)
     % Reply x(2)
  else
     % Reply x(1)
  end  
end

Ist das so richtig? Etwas Anpassung ist bestimmt nötig, weil mir nicht klar ist, welche Fälle genau zu welcher Ausgabe führen sollen.
Das ist zwar nicht sehr flexibel, sollte aber schneller sein als die Schleifen-Method.
Flexibeler kann man das wie gesagt mit DIFF lösen, indem man rechts oder links nach dem ersten bzw letzten positiven (oder nicht negativen?) Wert sucht, etwa: find(diff(x(5:9)) >= 0).
Die erste Entscheidung, ob man rechts oder links sucht würde ich auf alle Fälle nicht mit in die Schleife packen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stick_thai
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 14:49     Titel:
  Antworten mit Zitat      
Hallo Jan,

das sieht schon mal interessant aus. Ich werde mal schauen, wie ich das bei mir integrieren kann. Danke vielmals!

Gruß,
stick_thai.
Private Nachricht senden Benutzer-Profile anzeigen
 
stick_thai
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 25.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2010, 09:21     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für deinen Tipp, hat gut funktioniert.

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