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

For-Schleife ersetzen wegen Echtzeitfähigkeit

 

Archie1981
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 02.04.08
Wohnort: HDH / Ulm
Version: ---
     Beitrag Verfasst am: 23.04.2008, 14:18     Titel: For-Schleife ersetzen wegen Echtzeitfähigkeit
  Antworten mit Zitat      
Hallo.

Ich implemetiere zur Zeit eine Embedded Matlab Function die später unter Echtzeitbedingungen laufen soll.
Daher sollte man ja bei der Programmierung auf Schleifen verzichten.

Bisher speichere ich Werte einer Funktion in einem Vektor und schiebe diese Werte (innerhalb einer for-Schleife) wie in einem FIFO-Speicher in jedem Schritt um eine Stelle nach hinten.

Code:

for z=1:M-1
     Vektor(M-z+1,1)=Vektor(M-z,1);
end
 


Meine Frage:
Hat jemand eine Idee wie ich diese For-Schleife ersetzen kann??
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



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

Mir fallen so auf Anhieb folgende Möglichkeiten ein:
1)Eine Stelle nach hinten Schieben:
Code:

Vektor(end+1:-1:2)=Vektor(end:-1:1)
 


2)Vieleicht auch so:
Code:

Vektor=[0; Vektor];
 

3) mit Speicher-Reservierung
Code:

tmpVektor=zeros(length(Vektor)+1,1);
tmpVektor(2:end)=Vektor(1:end)
Vektor=tmpVektor;
clear Vektor;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 23.04.2008, 16:04     Titel:
  Antworten mit Zitat      
Zitat:
tmpVektor=zeros(length(Vektor)+1,1);
tmpVektor(2:end)=Vektor(1:end)
Vektor=tmpVektor;
clear Vektor;



hmm...


besser

Code:



Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.04.2008, 16:07     Titel:
  Antworten mit Zitat      
Danke tompie, das ist wirklich besser.

blödes Copy-Paste Fehler. Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Archie1981
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 02.04.08
Wohnort: HDH / Ulm
Version: ---
     Beitrag Verfasst am: 24.04.2008, 07:41     Titel:
  Antworten mit Zitat      
Hi denny

erst mal vielen Dank für Deine Hilfe!!!
Deine Ideen sind richtig gut. Hab Sie alle durchprobiert. einziges Problem ist, das der Vektor jedes mal um eine Stelle größer wird, das sollte nicht sein.

Funktionieren tuts damit:
Code:

Vektor(end:-1:2)=Vektor(end-1:-1:1);
 


mit Deinen anderen Vorschlägen ist es sicher auch noch möglich das zu realisieren, aber da es so funktioniert.... lass ich es.

Danke nochmal.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.04.2008, 08:17     Titel:
  Antworten mit Zitat      
Hallo,

Ach so, hab dein code irgendwie falsch verstanden, mir schien dass dein Array immer größer wird.
Die Größe von Array darf bei dir also sich nicht ändern?
Private Nachricht senden Benutzer-Profile anzeigen
 
Archie1981
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 02.04.08
Wohnort: HDH / Ulm
Version: ---
     Beitrag Verfasst am: 24.04.2008, 12:39     Titel:
  Antworten mit Zitat      
Hi.

Nein, der Vektor darf seine größe nicht ändern, weil er später mit einem zweiten Vektor mit fester größe multipliziert wird.

hatte vorher ein versuch mit der function circshift gestartet. allerdings taucht dann eine for-schleife innerhalb dieser funktion auf.
(edit circshift)

was ist bei dem befehl "end" in
Code:
Vektor(end:-1:2)=Vektor(end-1:-1:1);


ist da vielleicht eine for schleife "versteckt"?
Private Nachricht senden Benutzer-Profile anzeigen
 
tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 24.04.2008, 13:11     Titel:
  Antworten mit Zitat      
Hallo Archie,

end bezeichnet einfach immer das letzte Element eines Vektors. Vektor(end:-1:2) bezeichnet also die Elemente von Vektor in umgekehrter Reihenfolge ohne das erste Element. Vektor(end-1:-1:1) bezeichnet entsprechend die Elemente von Vektor in umgekehrter Reihenfolge ohne das letzte Element. Es wird also das vorletzte Element ins letzte kopiert (end-1 --> end), das drittletzte in das vorletzte (end-2 --> end-1) usw.

Du kannst auch schreiben

Code:
Vektor(2:end)=Vektor(1:end-1)


das geht auch, da Matlab erkennt, daß die Elemente nicht überschrieben werden sollen. Aus pädagogischen Gründen ist aber die Variante

Code:
Vektor(end:-1:2)=Vektor(end-1:-1:1);


sinnvoller, Du sollst ja hier was lernen Wink

Gruß tompie
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2008, 11:37     Titel:
  Antworten mit Zitat      
Lass doch einfach eine Index-Variable im Kreis laufen (RingPuffer):

Code:

persistent index;
persistent vektor;

if isempty(index)
     index = 1;
end

if isempty(vektor)
     vektor= zeros(1,10);
end

vektor(1,index) = input; % FIFO input

index = index + 1;

if(index == numel(vektor)) % FIFO overflow (ringbuffer)
     index = 1;
end

output = vektor(1,index); % FIFO output

 
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2008, 12:47     Titel:
  Antworten mit Zitat      
kleiner Fehler, muss oben natürlich

Code:

if(index > numel(vektor)) % FIFO overflow (ringbuffer)
     index = 1;
end
 



heissen[/quote]
 
Archie1981
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 02.04.08
Wohnort: HDH / Ulm
Version: ---
     Beitrag Verfasst am: 26.05.2008, 06:44     Titel:
  Antworten mit Zitat      
Die Indexvariable im Kreis laufen zu lassen wäre sicher auch eine Möglichkeit. Aber da die Reihenfolge, in der die Werte in dem Vektor stehen, entscheidend ist kommt das für mich nicht in Frage.
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 - 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.