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

Kombination

 

Matlab anfaenger

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2015, 16:05     Titel: Kombination
  Antworten mit Zitat      
Hey Leute ich habe eine grosse Bitte an euch. Folgendes Problem:

ich habe folgende Matrix:

Code:


A=[4, 3.5, 3, 2.5, 2, 3.5, 3, 2.5]
 


So jetzt soll die erste Zahl im Schritt 0.5 bis zur Zahl 1 hinunter zaehlen. Dann soll die zweite Zahl also 3.5 um 0.5 gemindert werden und die erste zahl soll wieder bis 1 im 0.5 Schritt hinunter zaehlen. Dass soll dann so durchlaufen. Wie kann man das in Matlab implementieren?

Beispiel:

4.0, 3.5, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
3.5, 3.5, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
3.0, 3.5, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
2.5, 3.5, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
2.0, 3.5, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
1.5, 3.5, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
1.0, 3.5, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
4.0, 3.0, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5
3.5, 3.0, 3.0, 2.5, 2.0, 3.5, 3.0, 2.5


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.06.2015, 10:50     Titel: Re: Kombination
  Antworten mit Zitat      
Hallo Matlab anfaenger,

Was hast Du denn bisher versucht und woran bist Du gescheitert?

Mit zwei Schleifen lässt sich das gut erledigen. Wenn Du das effizient machen möchtest, berechne zunächst die Größe des Outputs für eine Pre-allocation:
Code:
ColumnLen = (A-1) * 2;
nA = size(A, 2);
Len = prod(ColumnLen);
Result = zeros(Len, nA);

Die erste Spalte von Result erhälst Du so:
Code:
v = A(1):-0.5:1;
Result(:,1) ) = repmat(v.', prod(ColumnLen(2:nA), 1);

Für die zweite Spalte passt das aber nicht mehr direkt. Also ist dieser REPMAT-Ansatz nicht perfekt. Mit KRON geht es besser. Das überlasse ich aber mal Dir, weil dies eine Hausaufgaben-Frage sein könnte.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 18:53     Titel: Vorschlag
  Antworten mit Zitat      
Hey Jan vielen Dank fuer deinen Post. Ja ich habe mir schon Gedanken gemacht. Hier meine Loesung. Dabei habe ich das Beispiel ein bisschen veraendert. Ich hoffe es ist nachvollziehbar.

Code:


A1=[1:0.1:1.2;2:0.1:2.2];


A=[2:1/6:4;...
     1:1/6:3;...
     1:1/6:3;...
     1:1/6:3;...
     1:1/6:3;...
     1:1/6:3;...
     1:1/6:3;...
     1:1/6:3];                  

B=A';
A2=A1';

iline=1;
C=nan(size(A2,1)^2*(size(B,1)^6),10);
  for h=1:size(A2,1)
    for g=1:size(A2,1)
        for f=1:size(B,1)
            for e=1:size(B,1)
                for d=1:size(B,1)
                    for c=1:size(B,1)
                        for b=1:size(B,1)
                            for a=1:size(B,1)
                            C(iline,:)=[B(a,1),B(b,2),B(c,3),B(d,4),...
                                        B(e,5),B(b,6),B(f,7),B(d,8),...
                                        A2(g,1),A2(h,2)];                   %C=alle Ratio Kombinationenen, 1,2,3,4,5,6,7,8,A,B
                            iline=iline+1;
                            end
                        end
                    end
                end
            end
        end
    end
  end

 


Also dass ist mein Vorschlag fuer das Berechnen aller Kombinationen. Dabei geht die erste Spalte von 2 bis 4 und die anderen Spalten von 1 bis 3. Die letzten Spelten gehen von 1 bis 1.2 und von 2 bis 2.2 mit Schritt von 0.1. Wenn ich nun die Schrittweite kleiner mache sind die vielen for Schleifen sehr traege. Geht das irgendwie effizienter?

Schon mal sehr vielen Dank Jan.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.06.2015, 10:43     Titel: Re: Vorschlag
  Antworten mit Zitat      
Hallo Fabian12345,

Ich erkenne nicht, wie der Code mit der anfänglichen Frage zusammen hängt. Das scheint ein anderes Problem zu sein.
Am Anfang ging es darum die Werte der Matrix A elementweise in Schritten von 0.5 zu verkleinern. Jetzt gibt es zwei Matrizen und das Schrittweise Verkleinern finde ich auch nicht wirklich.
Die letzte Spalte geht "von 1 bis 1.2"? Ich dachte es geht um Schritte der Weite 0.5?

Da ich jetzt nicht mehr verstehe, was die eigentliche Fragestellung ist, kann ich keinen weiteren Vorschläge machen. Kannst Du das Problem nochmal eindeutig definieren? Ist die Anzahl der Spalten und Zeilen variabel?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2015, 12:25     Titel:
  Antworten mit Zitat      
Ja in der Tat. Am besten du betrachtest gar nicht die erste Frage. Ich habe eigentlich auch schon eine Loesung gefunden. Diese sieht folgender massen aus:

Code:

step1=1/6;
step2=1/6;

a_x=0.8;
a_y=1.2;
b_x=1.8;
b_y=2.2;

step_a=0.1;
step_b=0.1;

A1=single([b_x:step_b:b_y;a_x:step_a:a_y]);                                       %A steering wheel second; B steering wheel first


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ratio_combinations%%%%%%%%%%%%%%%%%%%%%%%%%%

A=[2:step1:4;...
   1:step2:3;...
   1:step2:3;...
   1:step2:3;...
   1:step2:3;...
   1:step2:3;...
   1:step2:3;...
   1:step2:3];                                                              

B=single(A');
A2=single(A1');

iline=1;
C=nan((size(B,1)^6),8);
C=single(C);
        for f=1:size(B,1)
            for e=1:size(B,1)
                for d=1:size(B,1)
                    for c=1:size(B,1)
                        for b=1:size(B,1)
                            for a=1:size(B,1)
                            C(iline,:)=single([B(a,1),B(b,2),B(c,3),B(d,4),...
                                        B(e,5),B(b,6),B(f,7),B(d,8)]);       %C=alle Ratio Kombinationenen, 1,2,3,4,5,6,7,8
                            iline=iline+1;
                            end
                        end
                    end
                end
            end
        end
       
       
%%%%%%%%%%%%%%%%%%%%%%%ratio_combination_add_A&B_ratio%%%%%%%%%%%%%%%%%%%%%
       
BB=nan(size(A2,1)^size(A2,2),size(A2,2));
BB=single(BB);
    for k20=1:size(A2,2)
        BB(:,k20)=repmat(reshape...
                 (repmat(A2(:,k20)',(size(A2,1))^(k20-1),1)...
                 ,[],1),size(A2,1)^(size(A2,2)-k20),1);                     %BB=alle Kombinationen Ratio von Zahnrad A und B
    end
   

   
DD=single(repmat(C,size(BB,1),1));
EE=kron(BB,ones(size(C,1),1));                                              
FF_allratio=horzcat(DD,EE);
 


Dies entspricht ziemlich genau was ich moechte. Allerdinngs frage ich mich ob ich das effizient gemacht habe, zumal ich sehr viele for Schleifen in einander verschachtelt habe. Also:

Frage 1:
geht das effizienter?

Frage 2:
Kann ich mit parfor arbeiten? Wenn ich das reinsetze bekomme ich immer einen Fehler.


Ich danke dir vielmals.

Beste Gruesse.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.06.2015, 16:06     Titel:
  Antworten mit Zitat      
Hallo Fabian12345,

Das lässt sich deutlich verbessern.
Code:
C=nan((size(B,1)^6),8);
C=single(C);

Hier wird zuerst C als DOUBLE erzeugt und dann gleich wieder mit einem anderen Typ überschrieben. Matlab's JIT-Accelerator leidet sehr unter Variablen, die ihren Typ ändern. Das kann dann schon mal um den Faktor 20 langsamer werden. Also lieber gleich:
Code:
C=nan(size(B,1)^6, 8, 'single');

B ist schon ein SINGLE, also benötigst Du keine Konversion:
Code:
C(iline,:)=[B(a,1),B(b,2),B(c,3),B(d,4),B(e,5),B(b,6),B(f,7),B(d,8)];
 

Ich finde "abcdebfd" verwirrend. Ist es gewollt, dass d zwei mal vorkommt?

size(B,1) benötigt nicht viel Rechenzeit, aber trotzdem muss man es nicht eine Millionen mal aufrufen. Also:
Code:
sizeB1 = size(B,1);

Und das dann in allen FOR-Schleifen einsetzen.

Den temporären Vektor [B(a,1),B(b,2), ...] immer wieder zu erzeugen verbraucht Resourcen. Ich vermute, dass es effizienter wäre, den Vektor immer wieder zu verwenden:

Code:

V = zeros(1, 8, 'Single');

        for f=1:size(B,1)
            V(7) = B(f, 7);
            for e=1:size(B,1)
                V(5) = B(e, 5);
                for d=1:size(B,1)
                    V(4) = B(d, 4);
                    V(8) = B(d, 8);  % Wirklich so gewollt?!
                    for c=1:size(B,1)
                        V(3) = B(c, 3);
                        for b=1:size(B,1)
                            V(2) = B(b, 2);
                            for a=1:size(B,1)
                               V(1) = B(a, 1);
                               C(iline,:) = V;
                               iline=iline+1;
                            end
...


Zitat:
Kann ich mit parfor arbeiten? Wenn ich das reinsetze bekomme ich immer einen Fehler.

Dann zeige doch den Code und die Fehlermeldung.

Ein Problem bleib die Zeilen-Orientierung in den Schleifen: Wenn C groß ist, passt es nicht in den Prozessor-Cache. Dann muss es zeitraubend bei jedem Einfügen des Vektors V aus dem langsamen RAM geholt und wieder zurück geschrieben werden. Dabei kann man z.B. die erste Spalte von C ja sehr leicht und schnell am Stück befüllen:
Code:
C(:, 1) = repmat(B(:, 1), n, 1)
% mit geeignetem n

Das lässt sich für die anderen Spalten auch übertragen. Etwas vergleichbares hast Du für BB auch gemacht, oder?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2015, 12:11     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank fuer deine Antwort. Ich habe alles mir sehr genau angeschaut und habe auch Zeitmessungen gemacht. Komischerweise ist meine Loesung schneller in der Ausfuehrung.

Was ich allerdings noch wissen wollte ist, wie man parfor realiseren wuerde bei meinem Loesungsvorschlag.

Ich bin da leider noch nicht ganz durchgestiegen. Wenn man einfach die for Schleife mit parfor erstezt bekomme ich die Fehlermeldung:

parfor loop cannot run during the way variable C is used
parfor loop cannot run during the way variable iline is used

Kannst du mir da weiterhelfen den parfor Befehl zu implementieren?
Das waere echt super.
Vielen Dank dafuer.
 
Harald
Forum-Meister

Forum-Meister


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

zur Parallelisierung:
http://de.mathworks.com/videos/seri.....ting-tutorials-97719.html
Insbesondere Teil 4.

Wozu wird diese riesengroße Matrix eigentlich benötigt?
Falls sie letztlich zeilen- oder spaltenweise abgearbeitet werden soll, wäre es vermutlich effizienter, das Abarbeiten unmittelbar mit dem Aufstellen der Zeilen / Spalten zu kombinieren.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2015, 14:38     Titel:
  Antworten mit Zitat      
Interessant!

Und wie meinst du das genau?

Gruss
Fabian123456
 
Fabian123456

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2015, 14:47     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

zur Parallelisierung:
http://de.mathworks.com/videos/seri.....ting-tutorials-97719.html
Insbesondere Teil 4.


Harald


Das bedeutet ja, dass ich dann in meinem Fall kein parfor anwenden kann oder?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.06.2015, 16:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das bedeutet ja, dass ich dann in meinem Fall kein parfor anwenden kann oder?

Woraus schließt du das?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2015, 17:17     Titel:
  Antworten mit Zitat      
Das Video erzaehlr mir, dass ich kein parfor einbauen kann, wenn wenn die Variablen sich aendern.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.06.2015, 21:41     Titel:
  Antworten mit Zitat      
Hallo,

es wäre sehr nett, wenn du deine Beiträge etwas ausführlicher gestaltest.
Welche Variablen sollen sich nicht ändern können?

Ja, die Verwendung von iline ist hier ein Problem, weil so eine Abhängigkeit zwischen den Iterationen entsteht. Hast du denn mal den Tipp aus dem Video versucht, den Inhalt der Schleife in eine Funktion auszulagern?

Die Frage
Zitat:
Wozu wird diese riesengroße Matrix eigentlich benötigt?

besteht weiterhin.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2015, 15:10     Titel:
  Antworten mit Zitat      
Hallo Harald!

Vielen Dank fuer deine Antwort. Tut mir Leid fuer meine Unausfuehrlichkeit. Die Matrix wird gebraucht um alle morglichen Kombinationen von verhaeltnissen eines Getriebes mit 8 Ubersetzungen und zwei zusaetzlichen Zahnraedern zu berechnen, um daraus die besten Ergebnisse mit einer if abfrage herauszufinden. Ich hoffe du kannst du darunter etwas vorstellen.

Das mit der Funktion habe ich noch nicht probiert, ist aber bestimmt eine Moeglichkeit. Gnerell gilt, dass bei mir jeder Schritt mit der vorherigen Matrix oder Ergebnissen berechnet wird. Nicht gerade eine top Voraussetzungen fuer parfor. Ich habe mal etwas ueber den Batch befehl gelesen habe aber keine Ahnung was es damit auf sich hat. Weisst du da mehr?

Beste Gruesse
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.07.2015, 15:37     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
, um daraus die besten Ergebnisse mit einer if abfrage herauszufinden.

Mit anderen Worten, man könnte das doch direkt mit der if-Abfrage testen?

Also: jede Kombination erstellen, testen, und wenn sie nicht optimal ist mit der nächsten weitermachen, anstatt alle Kombinationen zu erstellen und dann alle zu testen.

Zitat:
Gnerell gilt, dass bei mir jeder Schritt mit der vorherigen Matrix oder Ergebnissen berechnet wird. Nicht gerade eine top Voraussetzungen fuer parfor.

Stimmt. Dazu müssen die Iterationen unabhängig voneinander sein, d.h. die Ausführungsreihenfolge darf nicht entscheidend sein.

Zitat:
Ich habe mal etwas ueber den Batch befehl gelesen habe aber keine Ahnung was es damit auf sich hat. Weisst du da mehr?

Man kann es als Wrapper um parfor-Code verwenden. Das hilft aber nicht, wenn der parfor-Code nicht läuft. Eines der Videos ist übrigens über batch und seinen Zweck.

Grüße,
Harald
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.