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

vectorization

 

markC

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 11:44     Titel: vectorization
  Antworten mit Zitat      
Hallo,

hier ist ein Code mit 3 for-schleife.Die for loop dauert ewig wenn ich große Vektoren als input eingebe, deswegen möchte ich Vectorization verwenden. Leider krieg ich falsche Ergebnisse dafür.
habt Ihr ein Idee ... hier ist mein code.
Code:
na=5;
nb=10;
B=[2 5 5 2 2 2];

for k=1:na
   value = 0;
    for i=1:nb      
        A(1)=1;  
        for j = 1:i
            m = min(na,j);
            A(j+1)=B(1:m)*A(j:-1:j-m+1)';
        end;
        value = value + A(end);
    end
end


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.06.2011, 12:13     Titel:
  Antworten mit Zitat      
Hallo,

ich kann mir nicht vorstellen, dass der Code so sinnvoll ist, da:
- value in jeder Iteration auf 0 zurückgesetzt wird
- A in jeder äußeren Iteration überschrieben wird
- k in der Schleife nicht verwendet wird.

Mir scheint, dass hier irgendeine Form von Glättung / Faltung durchgeführt wird; dafür können z.B. CONVN oder FILTER nützlich sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
markC

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 12:56     Titel:
  Antworten mit Zitat      
danke für die schnelle Antwort. A(1) ist ein initialisierungswert, und K ist eigentlich eine Vektor. ich habe versucht die zwei inneren For-Schreife umschreiben mit "meshgrid", aber kriege ich unterschiedliche Ergebnisse dafür. CONVN oder FILTER scheint nicht nützlich sein.

das Code ist ein vereinfachten Segment. Original Code sieht so aus(zu lang und aufwendig zu verstehen, deswegen habe ich es vereinfacht Smile). das Code realisierte das "Backpropagation though time" Methode.

Original Code:
Code:

sd=rand(3000,1);
ns=1;
na=2;
nb=3;
ki=4;
len=3000;
ad= [3,3];
dyds=-1;

for n = (na + nb + 1 + ki):len
   
    for p = 1:ns
                    a = ad((p-1)*na+1:p*na);
                    dydan = zeros(1, na);
                    dydbn = zeros(1, nb);

 %----------die 2 For-Schleife dauert ewig für große Interation----              
                    for k=1:na
                        dsda = 0;
                        for i=1:ki
                            dsds = zeros(1, i+1);
                            dsds(1)=1;
                            for j = 1:i
                                m = min(na,j);
                                dsds(j+1)=-a(1:m)*dsds(j:-1:j-m+1)';
                            end;
                            dsds = dsds(end);
                            dsda = dsda + sd(n-k-i, p) * dsds;
                        end

                        dydan(k) = (-sd(n-k, p)-dsda) * dyds(p);
                    end
 %-----------------------------------------------------------

    end
end


was ich modifiziert habe mit "meshgrid". das Ergebnisse ist unterschiedlich und die Zeit Plotte sehe ich eine kleine Unterschiede
Code:

                    for k=1:na
                        dsda2 = 0;
                        dsds2(1,1)=1;                        
                        [i,j] = meshgrid(1:ki);    
                        dsds2 = -a(1:min(na,j)).*dsds2(j:-1:j-min(na,j)+1)';
                        dsds2 = dsds2(end);
                        sd_temp=sd(n-k-i, p);
                        dsda2 = sum(sd_temp) * dsds2;
                       
%                         dsds = -a(min(na,ki))*dsds(ki-min(na,ki)+1)';
%                         sd_temp=sd(n-k-ki, p)
%                         dsda2 = sum(sd_temp) * dsds;
                       
                        dydan(k) = (-sd(n-k, p)-dsda) * dyds(p);
                    end

 


Gruß
Mark
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.06.2011, 18:24     Titel:
  Antworten mit Zitat      
Hi Mark,

Ich arbeite dran. Bisher konnte ich Dein Beispiel schon mal um 42% beschleunigen. Jetzt mache ich aber erstmal eine Pause.

Guten Appetit, Jan
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: 20.06.2011, 21:40     Titel:
  Antworten mit Zitat      
Hallo markC,

Dies ist schonmal etwas schneller. Ich habe die wiederholte multiplikation mit -1 in "-a(..." nach außen gezogen und das MIN durch zwei Schleifen ersetzt. Statt immer wieder zu transponieren, wird der Vektor gleich in der richtigen Orientierung erzeugt. Für weitere Verbesserungen wäre es sehr hilfreich, die realistischen Dimensionen der Variablen zu kennen. Gerade bei der innersten Schleife wäre es wichtig zu wissen, ob "na" größer werden kann oder nicht.

Mit den bisherigen kleinen Änderungen komme ich von 0.87 auf 0.57 sec.

Code:
function dydan = asd3(sd,ns,na,nb,ki,len,ad,dyds)

dsds = zeros(ki+1, 1);        
for n = (na + nb + 1 + ki):len
   for p = 1:ns
      a = ad((p-1)*na+1:p*na);
      nega = -a;
      dydan = zeros(1, na);
      for k=1:na
         dsda = 0;
         for i = 1:ki
            dsds(:) = 0;
            dsds(1) = 1;
           
            for j = 1:na
               dsds(j+1) = nega(1:j) * dsds(j:-1:1);
            end
           
            va = nega(1:na);
            for j = na+1:i
               dsds(j+1) = va * dsds(j:-1:j-na+1);
            end
           
            dsda = dsda + sd(n-k-i, p) * dsds(i+1);
         end
         dydan(k) = (-sd(n-k, p)-dsda) * dyds(p);
      end
   end
end
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
markC

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2011, 13:59     Titel:
  Antworten mit Zitat      
vielen Dank,Jan. ich werde damit weiter arbeiten.
 
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.