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

wie vektorisieren?

 

thomas0815
Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2010, 18:17     Titel: wie vektorisieren?
  Antworten mit Zitat      
Hallo zusammen,

ich versuche die performance meines Codes zu steigern und möchte meine for-Schleifen vektorisieren. Ich habe nur ein Problem - es klappt nicht. Wie kann ich sowas vektorisieren?

Code:
for i=1:100;
for j=1:200;
for k=300:-1:2;

if x(i,j,k)==10;
u(i,j+1,k)==-inf;
end;

end;
end;
end;



Danke für Hinweise.

Viele Grüße,
Thomas
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: 10.08.2010, 18:49     Titel: Re: wie vektorisieren?
  Antworten mit Zitat      
Hallo Thomas:

Ich nehme an, Du meinst "u(i,j+1,k) = -inf;", und nicht "==".

Code:
index = (x == 10);  % Klammern für Lesbarkeit
index = cat(2, false(100, 1, 300), index);
u(index) = -Inf;

Es ist wahrscheinlich noch nötig u vorher mit der benötigten Größe zu erstellen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2010, 18:55     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für den Hinweis Ich werde das dann gleich ausprobieren und berichten. Aber was macht eigentlich dieses cat? und funktioniert das auch, wenn ich zu der if noch eine weitere elseif Anweisung verwende?

Gruß,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

es scheint für meine if-Anweisungen nicht zu funktionieren. Ich habe es mit einfachen arrays ausprobiert, aber habe einige schwierigkeiten bei der umsetzung der systematik. Aber danke für die Hinweise

Grüße
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: 12.08.2010, 16:06     Titel:
  Antworten mit Zitat      
Hallo Thomas,

CAT erklärt Dir am besten "help cat". Es fasst zwei oder mehr Arrays zu einem gemeinsamen zusammen.

Die "logical indexing" Methode funktioniert auch bei ELSEIF Bedingungen. Bei großen Arrays ist das in Matlab dramatisch schneller als ein Haufen von FOR-Schleifen (im Allgemeinen, Ausnahmen gibt es auch). Wenn es bei Dir nicht klappt, poste doch mal Deinen Code, denn "logical indexing" ist so praktisch, dass man es können sollte.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 17:54     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich möchte den folgenden code durch die indizierung ersetzen, weil er sehr, sehr langsam läuft. Vielleicht kannst du es mir an einem einfachen Beispiel noch einmal illustrieren. Das wäre klasse.

Code:
u(:,1,:)=x(:,1,:);
 u=[u; uu];
 

 

 for k=1:b;             % Beginne im Pfad b
    for j=2:T;              % in der Zeitstufe j
        for i=2:n;             % im Zustand j
           
 
                if u(i-1,j-1,k)==1;
                   
                    u(i,j,k)=x(i,j,k);
               
                elseif u(i,j-1,k)==2;
         
                    u(i,j,k)=x(i,j,k);
     
                elseif u(i+1,j-1,k)==3;
         
                    u(i,j,k)=x(i,j,k);
     
                else u(i,j,k)=-inf;
     
                end;
        end;
     % Für die erste Zeile i-1>>1
     
                if u(2,j-1,k)==3;
       
                    u(1,j,k)=x(1,j,k);
     
                elseif u(1,j-1,k)==2;
         
                    u(1,j,k)=x(1,j,k);
     
                else u(1,j,k)=-inf;
     
                end;
 
     
    end;
 
 end;


Danke und Grüße,
Thomas
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: 12.08.2010, 18:20     Titel:
  Antworten mit Zitat      
Hallo Thomas,

der Code ist nicht gerade ein einfaches Beispiel, an dem man das logical indexing hübsch demonstrieren könnte. Das sieht eher nach einer Indexschlacht aus...

Ich versuche es mal zumindest für k:
Code:
u(:,1,:)=x(:,1,:);
 u=[u; uu];

 for k=1:b;             % Beginne im Pfad b
    for j=2:T;              % in der Zeitstufe j
        for i=2:n;             % im Zustand j
               k = reshape(u(:, j-1, 1:b), n, b);
               index1 = (k(i-1, :) == 1);
               u(i,j, index1) = x(i,j,index1);
               index2 = (k(i, :) == 2);
               u(i,j, index2) = x(i,j, index2);
               index3 = (k(i+1, :) == 3);
               u(i, j, index3) = x(i,j, index3);
               
               u(i, j, not(index1 | index2 | index3)) = -inf;
        end;
        ...
    end
 end

Nimm das mal als Startpunkt. Laufen lassen kann ich das nicht, da mir die Daten fehlen. Es wird auch nur ein Laufindex ersetzt, aber das sollte das Programm schon mal deutlich beschleunigen.
Die "1:b" kannst Du durch ":" ersstzen, falls die Dimension passt.

Insgesamt macht das aber nicht den eindruck effizient zu sein. Ich vermute stark, dass sich da ganze in wenigen Zeilen erledigen lässt, aber der Code-Ausschnitt macht mir nicht ganz klar, was Du berechnen willst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 18:29     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich versuche das mal nachzuvollziehen; wenn ich noch fragen habe, dann melde ich mich dann noch mal!

Danke dir erst einmal vielmals!

Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 18:47     Titel:
  Antworten mit Zitat      
nee, also das versteh ich nicht, wieso wird k denn dann durch reshape u definiert - wenn k auch in der Schleife läuft? kompliziert! Vielleicht beschreibe ich einfach was ich machen möchte:

ich habe einen Array x, in dieser stehen nur die Werte 1,2,3 oder -inf.

also z.B. für x(i,j,k) x(:,:,10)

x(:,:,10) =
[-Inf -Inf -Inf -Inf
-Inf -Inf 1 -Inf
-Inf 2 2 1
2 3 3 2]

jetzt möchte ich einen array u erzeugen in dem folgendes steht.

for i=n:-1:1
for j=1:T
for k=1:b
wenn x(i,j,k)==2 ist, dann soll

in u(i,j,k)=2 stehen und
in u(i,j+1,k)=x(i,j+1,k) und sonst soll nur -inf in u stehen.

wenn x(i,j,k)==1 ist, dann soll


in u(i,j,k)=1 stehen und
in u(i+1,j+1,k)=x(i+1,j+1,k) und sonst soll nur -inf in u stehen.

wenn x(i,j,k)==3 ist, dann soll

in u(i,j,k)=3 stehen und
in u(i-1,j+1,k)=x(i-1,j+1,k) und sonst soll in u wieder nur inf stehen.

Im Ergebnis soll u also dann so aussehen:

u(:,:,10) =
[-Inf -Inf -Inf -Inf
-Inf -Inf -inf -Inf
-Inf -inf 2 1
2 3 -inf -inf]

also bei einer 2 soll er in j+1 in der selben Zeile bleiben
bei einer 3 soll er in j+1 um eine Zeile noch oben rücken
bei einer 1 soll er in j+1 um eine Zeile nach unten rücken.

Startpunkt ist immer x(end,1,: )...

Ist das irgendwie umsetzbar?

Danke und Grüße,
Thomas
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: 12.08.2010, 23:09     Titel:
  Antworten mit Zitat      
Hallo Thomas,

Falsch, Fehler, falsch!

Code:
u(:,1,:)=x(:,1,:);
 u=[u; uu];

   % **** Die Schleife mus raus!  for k=1:b
    for j=2:T;              % in der Zeitstufe j
        for i=2:n;             % im Zustand j
               k = reshape(u(:, j-1, 1:b), n, b);
               index1 = (k(i-1, :) == 1);
               u(i,j, index1) = x(i,j,index1);
               index2 = (k(i, :) == 2);
               u(i,j, index2) = x(i,j, index2);
               index3 = (k(i+1, :) == 3);
               u(i, j, index3) = x(i,j, index3);
               
               u(i, j, not(index1 | index2 | index3)) = -inf;
        end;
        ...
 end


Sorry, die FOR-Schleife über k ist ja gerade herausgefallen!!!

Gruß, 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: 12.08.2010, 23:45     Titel:
  Antworten mit Zitat      
Hallo Thomas,

ich kann Deiner Beschreibung immer noch nicht folgen.
Verwirrend finde ich, dass in
Code:
if u(i-1,j-1,k)==1
u(i,j,k)=x(i,j,k);

Zu einem j-Wert ein Wert in u geschrieben wird, der bei der nächsten Schleife ja wieder gelesen wird, wenn j eins größer ist.

In Deiner Beschreibung steht aber "wenn x(i,j,k)==2 ist, dann soll ". Das passt nicht zu "if u(i-1,j-1,k)==1".

Also, falls die Werte von u nicht von anderen Werten in u abhängen, würde man für eine Lösung ohne Schleifen das LOGICAL Array "x==2" benötigen:
Code:
u(x == 2) = 2;

Dies setzt überall da, wo in x eine 2 ist, auch in u eine 2.
Um das LOGICAL Array in der 2. Dimension nach oben zu verschieben:
Code:
[a,b,c] = size(x);
Index = (x == 3);
Index = cat(2, Index(:, 2:end, :), false(a, 1, c));


Läßt sich Deine Textbeschreibung nochweiter vereinfachen, etwa zu: Verschiebe in einem Array alle Werte mit 1 nach oben, alle mit 3 nach unten??

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2010, 08:49     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für die viele Mühe, die du dir da gemacht hast; ich werde die Dinge erst einmal ausprobieren. So vereinfachen, wie du es beschrieben hast, lässt sich das ganze leider nicht. Ich probiere es mal aus, ich habe noch so eine for-schleife, die ich auf diese Art wegbekommen muss. gerade die k-for-schleife ist sehr zeitintensiv. für k=1:1000 (und das ist die untere Grenze) rechnet er mehr als 12 Stunden (ich habe bis jetzt immer abgebrochen). die i for-schleife geht max. bis 200 und die j for-schleife max. bis 365. Sitze jetzt schon die ganze Woche an dem Problem - ohne fortschritt Sad!
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2010, 09:57     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich habe es ein bisschen modifziert, weil ich noch eine Zeile an den u-Array angefügt habe. Aber es funktioniert! Vielen Dank. Ich probiere es jetzt noch für meine anderen for-Schleifen aus. Falls ich probleme habe, poste ich die dann hier noch mal.

Viele Grüße und vielen Dank,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2010, 11:38     Titel:
  Antworten mit Zitat      
Also für die Anwendung mit if-Anweisungen habe ich es verstanden. Jetzt sitze ich an dieser for Schleife - hier würde ich jetzt auch gerne die k-for-schleife eliminieren; das Problem ist, dass ein Index von CO durch b_out und b_in vorgegeben wird, was die Lösung des Problems erheblich erschwert. Ich habe versucht k über reshape neu zu sortieren, aber dann sind mir die ideen ausgegangen, wie ich das weiter verfolgen kann. Ich brauche den array CO am Ende wieder genau in der Form, wie es hier in dem Code steht.

Code:
   
for j=1:T
for i=n:-1:1;
        for k=1:b;
             

       
       
       [A(i,j,k) X(i,j,k)]=max([RR(i,j,k)+CO(k,b_out(i,j)),CO(k,i),R_IN(i,j,k)+CO(k,b_in(i,j))]);
       
        end
    end
end


Wäre für Ideen und Hinweise sehr dankbar.

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2010, 15:48     Titel:
  Antworten mit Zitat      
Die X(i,j,k) müssen tatsächlich am Ende auch als X(n x T x b) Array vorliegen!

Das funktioniert mit meinem Ansatz aber nicht ...

Code:
[A X]=max([reshape(r_out(i,j,:),b,1)+yco(:,b_out(i,j)),yco(:,i),reshape(r_in(i,j,:),b,1)+yco(:,b_in(i,j))])


Nachtrag: Ich habe das Problem gelöst... ein wirklich sehr dummer denkfehler ...

Code:
[A(i,j,:) X(i,j,:)]=max([reshape(r_out(i,j,:),b,1)+yco(:,b_out(i,j)),yco(:,i),reshape(r_in(i,j,:),b,1)+yco(:,b_in(i,j))],[],2)


sollte so passen, oder?

Trotzdem ist die Rechenzeit immernoch sehr lang - ich konnte aufgrund der Dauer noch keinen Lauf bis zu Ende bringen. Ich habe jetzt 5 Schleifen die sich je mit einer i-for-Schleife und einer j-for-Schleife zusammen setzen mit i=1:100 und j=1:365 ... doch es dauert und dauert - was ist da noch zu machen?
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.