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

Loop -> Vectorization?

 

dummy2k
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2012, 13:38     Titel: Loop -> Vectorization?
  Antworten mit Zitat      
Hallo,

ich bin relativ neu in Matlab und hab erst vor kurzem einen Trick, sprich Vectorization, kennengelernt, wie man Berechnungen bzw. Loops umgehen kann.

Nun bin ich bei einer Schleife angelangt, wo ich keine Idee hätte wie man das verbessern oder gar den Loop auflösen könnte. Hat jmd vielleicht eine Idee oder kann man das nur in ner Schleife lösen? Danke!

Code:

num=0;
for i=1:10
     tmp =  bitshift(num,8);
     num = bitor(tmp, i);
end
 
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 23.11.2012, 16:59     Titel:
  Antworten mit Zitat      
Hallo,

kann man sicherlich, aber warum sollte man das tun? Smile

Grüße, Marc
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.11.2012, 22:14     Titel: Re: Loop -> Vectorization?
  Antworten mit Zitat      
Hallo dummy2k,

Vektorisieren kann eine Menge Rechenzeit sparen, muss aber nicht. Deswegen ist eine gute Programmier-Paxis, eine Schleifen und eine vektorisierte Version zu programmieren und die Ergebnisse zu vergleichen. Wenn die Ergebnisse gleich sind, ist das ein gewisser Hinweis darauf, dass vielleicht kein Fehler im Code steckt. Wenn ein winziger Unterschied zu finden ist, ist der Algorithmus eventuell anfällig für Rundungsfehler. Wenn sich die Ergebnisse unterscheiden, hat man einen Bug zu finden.

Aber im Fall Deines Code-Stücks sehe ich keine Möglichkeit für eine Vektorisierung, da die Werte für jede Iteration von vorhergehenden Wert abhängen. Dies ist zwar auch mit CUMSUM und CUMPROD im Prinzip vektorisierbar, aber nicht für Bit-Shift-ing und Or-ing.

Siehe auch http://www.gomatlab.de/faq-performa.....ektorisierung-t19996.html.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2012, 22:54     Titel: Re: Loop -> Vectorization?
  Antworten mit Zitat      
Code:

num=0;
for i=4:10
     tmp =  bitshift(num,8);
     num = bitor(tmp, i);
end
 


Zwar nicht vektorisiert, aber optimiert Wink

Resultat ist das gleiche.

und vektorisiert:
Code:
sum((4:10).*2.^(8*(6:-1:0)))

oder
Code:
sum((4:10).*2.^(48:-8:0))
Private Nachricht senden Benutzer-Profile anzeigen
 
dummy2k
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2012, 14:23     Titel:
  Antworten mit Zitat      
Vielen Dank ihr 2 für die Antworten! Ich weiß das wirklich zu schätzen und hoffe eines Tages mich revanchieren zu können Smile

@dmjr
wow, diese Lösung ist wirklich genial, thx! Auch wenn mir momentan nicht ganz klar ist, wie du das mit "bitor" gelöst hast. Das muß ich mir noch genauer ansehen. Ich hoffe du bist dann nachher noch verfügbar, falls noch Fragen auftauchen Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2012, 14:27     Titel:
  Antworten mit Zitat      
Du musst den Integer mal Array von Bytes betrachten, dann merkst du dass jeweils nur an dem letzen gearbeitet wird und der Rest nur Geshiftet wird. Entweder das eine oder das andere Byte ist 0. Unter der Voraussetzung ist Bitor und Addition identisch.
Private Nachricht senden Benutzer-Profile anzeigen
 
dummy2k
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2012, 16:48     Titel:
  Antworten mit Zitat      
dmjr hat Folgendes geschrieben:
Du musst den Integer mal Array von Bytes betrachten, dann merkst du dass jeweils nur an dem letzen gearbeitet wird und der Rest nur Geshiftet wird. Entweder das eine oder das andere Byte ist 0. Unter der Voraussetzung ist Bitor und Addition identisch.


Sorry, leider kann ich nicht nachvollziehen, weshalb du das Bitor weglassen kannst. Wenn du vielleicht Zeit und Lust hast, kannst du das vielleicht so erklären, dass es jmd versteht, der nicht so viel Grundlagenwissen hat?

Aber ich poste mal den eigentlich Code, ich erwarte natürlich keine Lösung, aber denkst du das es grundsätzlich möglich ist, das ebenfalls zu vektorisieren?

Code:


for j=nbytes-1: -1: 1;
    num = bitor( num*2^8, bytes(j));
    p = floor(num/sizes(i+1));
    num  =  num - p * sizes(i+1);
    bytes(j) = p;
end

 


Tausend Dank falls du dir Mühe machst, aber wenn nicht, versteh ich das auch Smile
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.