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

Werte aus parfor-loop auslesen

 

psigh
Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2012, 16:36     Titel: Werte aus parfor-loop auslesen
  Antworten mit Zitat      
Hallo,

ich habe eine Frage zu meinem parfor-Beispiel:


Code:

Y=rand(100,3)
matlabpool open
parfor p=1:2
        for q=1:2
           
               for e=1:3    
               Z=sum(Y(:,e)+p*q)  
               end
           
        end
end
matlabpool close
 


Für jede Kombination von p und q wird die innerste Schleife 3 Mal ausgeführt und ich erhalte eigentlich 3 verschiedene Z Werte. Die würde ich gerne in einer Matrix Speichern. Z.B. so:


Code:

 1           1       1       1        1        1      
 1           1       1       2        2        2      . . .
Z(1)    Z(2)   Z(3)   Z(4)    Z(5)     Z(6)    
 

Ich weiß nicht, wie ich dies bei parfor umsetzten kann. Wenn es nur ein for-loop wäre, würde ich es einfach so machen:

Code:

Y=rand(100,3)
z=1
for p=1:2
        for q=1:2
           
               for e=1:3    
               Z=sum(Y(:,e)+p*q)  
               end
               
               ergebnis(1,z)=p
               ergebnis(2,z)=q
               ergebnis(3,z)=Z
               z=z+1
         
        end
end
 


Wäre super, wenn jemand von Euch einen Tip hätte.


Vielen Dank


Dominik
Private Nachricht senden Benutzer-Profile anzeigen


psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2012, 18:51     Titel:
  Antworten mit Zitat      
Für den Anfang würde es mir auch schon reichen wenn es möglich wäre, die entstehenden Z(1)...Z(12) einfach in einem Zeilenvektor o.ä. zu speichern.
Private Nachricht senden Benutzer-Profile anzeigen
 
Pinky
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2012, 23:24     Titel:
  Antworten mit Zitat      
Hallo,
ich bin mir ein bisschen unsicher, wofür du die Loops überhaupt brauchst. Wenn du sie haben willst, würde ich es eher so machen:
Code:

Y=rand(100,3);
Z=zeros(12,3);
x={[1;1],[1;2],[2;1],[2;2]}

for i=1:4
   Z(1:2,(i-1)*3+1:(i-1)*3+3)=repmat(x{i},1,3);
   Z(3,(i-1)*3+1)=sum(Y(:,1))+prod(x{i});
   Z(3,(i-1)*3+2)=sum(Y(:,2))+prod(x{i});
   Z(3,(i-1)*3+3)=sum(Y(:,3))+prod(x{i});
end
 



gruß Pinky
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2012, 23:30     Titel:
  Antworten mit Zitat      
Vielen Dank für Deine Antwort. Ich kann sehr gut verstehen, dass Du Dir diese Frage stellst.

Mein eigentliches Problem ist von dem Bespiel verschieden. Aber ich wollte als Repräsentanten ein kleines Beispiel angeben in der Hoffnung, dass ich die Lösung auf mein Problem anwenden kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Pinky
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2012, 23:34     Titel:
  Antworten mit Zitat      
Löblich, allerdings glaube ich, dass es fast immer besser ist, das Beispiel direkt anzugeben. Besonders parfor Loops sind sehr eigen in dem was sie zulassen.

Was bei deinem Beispiel nicht geht, ist eine Variable zu definieren, die du nach dem parfor loop verwendest aber in jedem einzelnen schreibst.

Du musst also für jede parfor schleife das i. element eines bereits vorhandenen Vektors benutzen.

Code:

Y=rand(100,3);
Z=Zeros(12,1);
matlabpool open
parfor p=1:2
        for q=1:2
           
               for e=1:3    
               Z(index)=sum(Y(:,e)+p*q)  
               end
           
        end
end
matlabpool close
 


gruß Pinky
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2012, 23:42     Titel:
  Antworten mit Zitat      
Dann mache ich das einfach mal:

Code:

matlabpool open
   
   
    parfor p=1:length(kaufsignal)
        for q=1:length(verkaufsignal)
            for u=1:length(massmooth)
                %--------------------------------------------------------------------------
                %--------------------------------------------------------------------------
                %Bootstrap-Sektion
               
                for e=1:anzahl_bootstraps
                    x=verkaufsignal(1,p);y=verkaufsignal(1,q);z=massmooth(1,u);
                 
                    %--------------------------------------------------------------------------
                    %--------------------------------------------------------------------------
                    R=Rsi(Y(:,e), z);
                    R=R';
                    %------------------------------------------------------------------------
                    vermoegen=zeros(long,1);
                    drin=3;
                    vermoegen(1)=kapital;
                   
                    for i=2:long
                        if R(i)>x && R(i-1)<=x &&drin~=1;
                            drin=1;
                            vermoegen(i)=vermoegen(i-1)*t_k;
                        elseif R(i)<y && R(i-1)>=y &&drin~=0;
                            drin=0;
                            vermoegen(i)=vermoegen(i-1)*t_k;
                        elseif drin==1
                            vermoegen(i)=vermoegen(i-1)*(Y(i,e)/Y(i-1,e));
                        elseif drin==0
                            vermoegen(i)=vermoegen(i-1)*(1+(1-(Y(i,e)/Y(i-1,e))));
                        else vermoegen(i)=vermoegen(i-1);
                        end
                    end
                    %-----------------------------------------------------------------------
                    %--------------------------------------------------------------------------
                    Renditen_Vermoegen=[0;log(vermoegen(2+einpendeln:end)./vermoegen(1+einpendeln:end-1))];
                    %--------------------------------------------------------------------------
                    %--------------------------------------------------------------------------
                    %Performancemessung
                    mittelwert=mean(Renditen_Vermoegen.*weight);
                    %--------------------------------------------------------------------------
                   
                   
                end
            end
        end
    end
    matlabpool close
 


Für jede kombination aus den vektoren kaufsignal, verkaufsignal und massmooth gibt es jeweils "anzahl_bootstraps"-viele mittelwerte. Dieser mittelwert soll immer gespeichert werden. So wie der code jetzt ist, läuft er super durch. Alles klappt. Nur die Speicherung klappt nicht.

Ich hatte an sowas gedacht:

Code:

    ergebnisse=zeros([length(kaufsignal),length(verkaufsignal),length(massmooth),anzahl_bootstraps]); %NEU!!
    matlabpool open
    parfor p=1:length(kaufsignal)
        for q=1:length(verkaufsignal)
            for u=1:length(massmooth)
                %--------------------------------------------------------------------------
                %--------------------------------------------------------------------------
                %Bootstrap-Sektion
               
                for e=1:anzahl_bootstraps
                    x=verkaufsignal(1,p);y=verkaufsignal(1,q);z=massmooth(1,u);
                 
                    %--------------------------------------------------------------------------
                    %--------------------------------------------------------------------------
                    R=Rsi(Y(:,e), z);
                    R=R';
                    %------------------------------------------------------------------------
                    vermoegen=zeros(long,1);
                    drin=3;
                    vermoegen(1)=kapital;
                   
                    for i=2:long
                        if R(i)>x && R(i-1)<=x &&drin~=1;
                            drin=1;
                            vermoegen(i)=vermoegen(i-1)*t_k;
                        elseif R(i)<y && R(i-1)>=y &&drin~=0;
                            drin=0;
                            vermoegen(i)=vermoegen(i-1)*t_k;
                        elseif drin==1
                            vermoegen(i)=vermoegen(i-1)*(Y(i,e)/Y(i-1,e));
                        elseif drin==0
                            vermoegen(i)=vermoegen(i-1)*(1+(1-(Y(i,e)/Y(i-1,e))));
                        else vermoegen(i)=vermoegen(i-1);
                        end
                    end
                    %-----------------------------------------------------------------------
                    %--------------------------------------------------------------------------
                    Renditen_Vermoegen=[0;log(vermoegen(2+einpendeln:end)./vermoegen(1+einpendeln:end-1))];
                    %--------------------------------------------------------------------------
                    %--------------------------------------------------------------------------
                    %Performancemessung
                    mittelwert=mean(Renditen_Vermoegen.*weight);
                    %--------------------------------------------------------------------------
                    ergbnisse(p,q,u,e)=mittelwert;%NEU!!
                   
                end
            end
        end
    end
    matlabpool close
 


Leider sagt er dann

"The variable intervall in a parfor cannot be classified." Ich bin darauf gekommen, weil Folgendes, in Bezug auf mein Anfangsbeispiel, klappt:

Code:

  Y=rand(100,3)
  Z = zeros([2,2,3]);
  matlabpool open
  parfor p=1:2
          for q=1:2
                   for e=1:3    
                   Z=sum(Y(:,e)+p*q)  
                   end
            end
    end
    matlabpool close  
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Pinky
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2012, 00:02     Titel:
  Antworten mit Zitat      
Hm, da ich gerade unterwegs bin, kann ich es nicht überprüfen. Der Code sieht eigentlich gut aus. Wie gesagt, parfor ist einfach ein mieser Hund.

In deinem Beispiel fehlt aber der Index bei Z, vielleicht liegt da der Unterschied?

Was vielleicht klappen könnte, ist ergebnisse in jedem Loop als 3 dim Matrix zu speichern (nicht von p abhängig) und dann diese Matrix in einem p langen cell zu speichern. Damit hätest du in jedem einzelnen Parfor loop genau ein Element was du speicherst.

gruß Pinky
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2012, 00:11     Titel:
  Antworten mit Zitat      
Super Idee, das würde ich gern mal versuchen. Ich weiß noch nicht ganz wie ich das mache, aber ich schraub einfach mal weiter dran rum.


Vielen Dank!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Pinky
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2012, 12:44     Titel:
  Antworten mit Zitat      
Also in deinem Code würde es dann heißen:

Code:

ergebnisse(q,u,e)=mittelwert;
 


Vor dem end der parfor Schleife würde dann etwas wie:
Code:
Erg{p}=ergebnisse;


Wenn das klappt, dann kannst du das Cell Erg mit dem cell2mat Befehl sicher wieder in eine große Matrix umwandeln.

gruß Pinky
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2012, 16:05     Titel:
  Antworten mit Zitat      
Hi, ich hab das gestern noch versucht. Jede innere Indizierung die nicht mit p anfängt, klappt nicht. Ich könnte machen ergebnis(p,e)=mittelwert. Dann werden natürlich jede Menge mittelwerte überschrieben und es kommt nicht raus, was ich will. Aber es läuft durch. ergebnisse(q,u,e)=mittelwert oder sogar ergebnisse(p,q,u,e)=mittelwert würde auch nicht gehen. Deswegen habe ich mich jetzt dazu entschieden, einfach zwei äußere Schleifen weg zu nehmen. Das ist zwar nur eine vereinfachte Version, aber sie ist Schnell und ich komme auch ungefähr auf die Werte, die ich brauche. Das andere wäre besser, aber ich bin etwas unter Zeitdruck (-:

Code:

    matlabpool open 8
   
            parfor u=1:length(massmooth)

                %Bootstrap-Sektion
               
                for e=1:anzahl_bootstraps
                    z=massmooth(1,u);
                 

                    R=Rsi(Y(:,e), z);
                    R=R';

                    vermoegen=zeros(long,1);
                    drin=3;
                    vermoegen(1:einpendeln)=kapital;
                   
                    for i=einpendeln+1:long
                        if R(i)>0.3 && R(i-1)<=0.3 &&drin~=1;
                            drin=1;
                            vermoegen(i)=vermoegen(i-1)*(1+(1-(Y(i,e)/Y(i-1,e))))*(randn(1)/1000+1)-2*t_k;
                        elseif R(i)<0.7 && R(i-1)>=0.7 &&drin~=0;
                            drin=0;
                            vermoegen(i)=vermoegen(i-1)*(Y(i,e)/Y(i-1,e))*(randn(1)/1000+1)-2*t_k;
                        elseif drin==1
                            vermoegen(i)=vermoegen(i-1)*(Y(i,e)/Y(i-1,e))*(randn(1)/1000+1);
                        elseif drin==0
                            vermoegen(i)=vermoegen(i-1)*(randn(1)/1000+1)*(1+(1-(Y(i,e)/Y(i-1,e))));
                        else vermoegen(i)=vermoegen(i-1);
                        end
                    end

                    Renditen_Vermoegen=[0;log(vermoegen(2+einpendeln:end)./vermoegen(1+einpendeln:end-1))];

                    %Performancemessung
                    mittelwert(u,e)=mean(Renditen_Vermoegen.*weight);

                   
                   
                end
            end
   
    matlabpool close
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Pinky
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2012, 16:53     Titel:
  Antworten mit Zitat      
Code:
[b]Erg{p}=ergebnisse;[/b]


Da ist doch eine Indizierung mit P drin. In einer parfor schleife ist es eigentlich kein Prolem sogenannte temporäre Variablen zu definieren.


gruß Pinky
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.