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?
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);
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
Fabian12345
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.06.2015, 18:53
Titel: Vorschlag
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.
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?
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
Fabian12345
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 25.06.2015, 12:25
Titel:
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
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.
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:
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:
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
Fabian123456
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.06.2015, 12:11
Titel:
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.
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.
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
Fabian123456
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.07.2015, 15:10
Titel:
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?
, 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.
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
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.