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

Verschachtelte For Schleifen Vektorisieren

 

Manilo
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 30.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2012, 21:13     Titel: Verschachtelte For Schleifen Vektorisieren
  Antworten mit Zitat      
Hallo zusammen,

hoffentlich kann mir hier jemand mit meinem Problem weiter helfen.
Ich habe mehrere ineinander verschachtelte Schleifen. Bei voller Ausführung möchte ich die berechneten Werte in eine mx2 Matrix speichern. m entspricht der Anzahl durchläufe. 1. Spalte ist der Index 1 - m und die 2. Spalte die berechneten Werte.

Hier der Code vereinfacht (2 Schleifen):
Code:

tic
clear


c = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % Konstante Werte
[m,n] = size(c);
A = 0;
i=1;
j=2;

for L = 0.13:0.027:0.4
    LL = L*L;
    L3 = L*L*L;
    L4 = L*L*L*L;
    for LL = 0.08:0.017:0.25
        LLL = L*LL;
        LLLL = LL*LL;
        LL3 = LL*LL*LL;
        LL4 = LL*LL*LL*LL;
       
V = [1 L LL ...                   % Abhängige Werte von L und LL
    LLL ...
    LL LLLL ...
    L3 L4 LL3 LL4];

A = c.*V;
Val   = sum(A);

A1(i,j)= Val*Val;
A1(i,j-1)=i;
i=i+1;

    end
end

toc
 


Bei neun Inputparametern auf 10 Stufen werden 10^9 Werte berechnet, das kann bis zu 4 Tage dauern.

Wie kann ich hier geschickt mit einer Vektorisierung arbeiten?

Viele Grüße und vielen Dank schon mal im Voraus!
Manilo
Private Nachricht senden Benutzer-Profile anzeigen


Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 27.07.2012, 07:12     Titel:
  Antworten mit Zitat      
Hey,

check deine Schleifen nicht so ganz:

Code:
for L = 0.13:0.027:0.4
    LL = L*L;
    L3 = L*L*L;
    L4 = L*L*L*L;
    for LL = 0.08:0.017:0.25
        LLL = L*LL;
        LLLL = LL*LL;
        LL3 = LL*LL*LL;
        LL4 = LL*LL*LL*LL;


in der ersten Schleife berechnest du "LL" damit du in der zweiten diesen Wert neu setzt (Index der for Schleife). Was ist der Sinn dahinter, dann brauchst du doch "LL" gar nicht berechnen?

repmat wäre hier eine Möglichkeit um die Schleifen auszulassen und alles in Vektorschreibweise hin zu schreiben (brauchst du für die zweite Schleife).

Für die erste Schleife würde reichen:

Code:
L = 0.13:0.027:0.4;
LL = L.^2;
LL3 = L.^3;
LL4 = L.^4;
Private Nachricht senden Benutzer-Profile anzeigen
 
Manilo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 30.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2012, 08:37     Titel:
  Antworten mit Zitat      
LL brauche ich für V:

Code:

V = [1 L LL ...                   % Abhängige Werte von L und LL
    LLL ...
    LL LLLL ...
    L3 L4 LL3 LL4];
 


um den später mit c zu multiplizieren.
Kann man sich so vorstellen:
y = c + c1*x1 + c2 * x2 + c11 * x1 * x2 + ... + c11 * x1² + ...

Dafür berechne ich L (x1) und dann LL (x2) und dann LLL (x1 * x2)
Ist das so verständlicher?

Okay, das mit der ersten Schleife leuchtet mir ein.
Repmat ist dann wohl eine Matlab Funktion?
Private Nachricht senden Benutzer-Profile anzeigen
 
Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 27.07.2012, 09:12     Titel:
  Antworten mit Zitat      
Code:
for L = 0.13:0.027:0.4
    LL = L*L;
    L3 = L*L*L;
    L4 = L*L*L*L;
    for LL = 0.08:0.017:0.25
        LLL = L*LL;
        LLLL = LL*LL;
        LL3 = LL*LL*LL;
        LL4 = LL*LL*LL*LL;
       
V = [1 L LL ...                   % Abhängige Werte von L und LL
    LLL ...
    LL LLLL ...
    L3 L4 LL3 LL4];


Ok gut aber wenn du LL vor der zweiten for Schleife berechnest aber dann diesen Wert immer mit dem Wert von der zweiten for Schleife überschreibst dann ist die Berechnung irgendwie umsonst.

repmat ist eine Matlab Funktion.
Private Nachricht senden Benutzer-Profile anzeigen
 
Manilo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 30.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2012, 09:41     Titel:
  Antworten mit Zitat      
Oh ja, jetzt seh ich was du meinst. Da ist mir ein Fehler unterlaufen.
Es müsste also so aussehen um das Problem klar darzustellen:

Code:

for L = 0.13:0.027:0.4
    L2 = L*L;
    L3 = L*L*L;
    L4 = L*L*L*L;
    for LL = 0.08:0.017:0.25
        LLL = L*LL;
        LL2 = LL*LL;
        LL3 = LL*LL*LL;
        LL4 = LL*LL*LL*LL;
       
V = [1 L L2 ...                   % Abhängige Werte von L und LL
    LLL ...
    LL LL2 ...
    L3 L4 LL3 LL4];
 


Es soll also nichts überschrieben werden. Das würde ja kein Sinn machen ;o)
Private Nachricht senden Benutzer-Profile anzeigen
 
Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 27.07.2012, 09:50     Titel:
  Antworten mit Zitat      
So jetzt kommen wir der Sache ja schon näher Very Happy

Eine Frage noch. In der zweiten for Schleife ist eigentlich nur LLL von dem L aus der ersten Schleife abhängig, der Rest könnte auch unabhängig von der ersten Schleife berechnet werden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Manilo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 30.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2012, 10:02     Titel:
  Antworten mit Zitat      
Ja genau, das ist richtig.
Private Nachricht senden Benutzer-Profile anzeigen
 
Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 27.07.2012, 10:16     Titel:
  Antworten mit Zitat      
Schau mal ob es dir den erwünschten Erfolg bringt

[code]
L = 0.13:0.027:0.4;
LL = 0.08:0.017:0.25;
L_rep = sort(repmat(L,1,length(L)*length(LL)));
LL_rep=repmat(LL,1,length(L)*length(LL));

L2=L.^2;
L3=L.^3;
L4=L.^4;
LLL=L_rep.*LL_rep;
LL2=LL.^2;
LL3=LL.^3;
LL4=LL.^4;
[\code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Manilo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 30.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2012, 19:39     Titel:
  Antworten mit Zitat      
Leider nein und es verwirrt mich alles nur noch mehr. Auf diese Weise wird V viel zu groß und ich kann es nicht mehr mit c multiplizieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
dotwinX
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 06.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2012, 13:51     Titel:
  Antworten mit Zitat      
Zitat:
y = c + c1*x1 + c2 * x2 + c11 * x1 * x2 + ... + c11 * x1² + ...


Was ist das Ziel deiner Berechnung?
Für mich sieht das sehr nach einer Regression aus. Vielleicht könnte man dort schon was optimieren?
Private Nachricht senden Benutzer-Profile anzeigen
 
Manilo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 30.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2012, 14:17     Titel:
  Antworten mit Zitat      
Das Ziel ist eine Formel mit einer hohen Anzahl von Termen zu berechnen.
Dabei sollen alle Kombinationsmöglichkeiten der Variablen xi berücksichtigt werden. Die Konstanten C für jeden Term sind antürlich (wie es der Name sagt) Konstant.

Ist aber keine Regression. Die Konstanten sind bekannt.
Private Nachricht senden Benutzer-Profile anzeigen
 
dotwinX
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 06.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2012, 02:54     Titel:
  Antworten mit Zitat      
Wad ihr für komische Sachen macht Smile

Hier Vorschlag 1, die Doppelschleife erstmal wechmachen

Code:
clear all
tic

c = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % Konstante Werte
[m,n] = size(c);
A = 0;
i=1;
j=2;

L = 0.13:0.027:0.4;
L2 = L.*L;
L3 = L.*L.*L;
L4 = L.*L.*L.*L;

LL = 0.08:0.017:0.25;
LLL = L.*LL;
LL2 = LL.*LL;
LL3 = LL.*LL.*LL;
LL4 = LL.*LL.*LL.*LL;

for i=1:1:length(L4)
    V=[1 L(i) L2(i) LLL(i) LL(i) LL2(i) L3(i) L4(i) LL3(i) LL4(i)];
    A = c.*V;
   
    Val   = sum(A);

    A1(i,j)= Val*Val;
    A1(i,j-1)=i;
    i=i+1;
end
toc


alternativ könnte man den Vektor V in eine Matrix verwandeln und dann für direkte Berechnung nutzen:
Code:
clear all
tic

c = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % Konstante Werte
[m,n] = size(c);
A = 0;
i=1;
j=2;

L = 0.13:0.027:0.4;
L2 = L.*L;
L3 = L.*L.*L;
L4 = L.*L.*L.*L;

LL = 0.08:0.017:0.25;
LLL = L.*LL;
LL2 = LL.*LL;
LL3 = LL.*LL.*LL;
LL4 = LL.*LL.*LL.*LL;

V_matrix=[ones(11,1) L' L2' LLL' LL' LL2' L3' L4' LL3' LL4'];
A_matrix=bsxfun(@times,V_matrix,c);
Val_vec=sum(A_matrix,2);
A1_vec=Val_vec.*Val_vec;
A1_vec=[1:length(A1_vec); A1_vec']';

toc


Hilft das?
Private Nachricht senden Benutzer-Profile anzeigen
 
Manilo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 30.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2012, 15:03     Titel:
  Antworten mit Zitat      
Ja das hilft bedingt.

Mit diesem Vorschlag werden nun Werte berechnet.
Jedoch würde ich gerne alle möglichen Kombinationen berechnen.
Bedeutet also es wären im Falle von 2 Parametern auf 11 Level = 11^2=121 Werte. Wie ich das nun umsetzen soll, ohne eine Rechenintensive verschachtelte Schleife zu verwenden, weiß ich nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
dotwinX
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 06.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2012, 14:23     Titel:
  Antworten mit Zitat      
Ich glaube ich hab das Problem noch nicht ganz verstanden Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2012, 15:24     Titel:
  Antworten mit Zitat      
SO wirklich verstehe ich die Problematik auch nicht,

Manilo hat Folgendes geschrieben:

Jedoch würde ich gerne alle möglichen Kombinationen berechnen.
Bedeutet also es wären im Falle von 2 Parametern auf 11 Level = 11^2=121 Werte.


Das sind in meinen Augen keine 121 = 11^2, wenn ich 2 Parameter und 11 Level (was auch immer das genau ist) habe, dann habe ich eine Matrix mit 2 \cdot 11 = 22 Elementen. Die Anzahl der Kombinationen dieser 22 Werte ist 22! = 1.124\ 000\ 728 \cdot 10^{21}
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.