Guten Abend, ich multipliziere in Simulink mit Matrizen umher. Dabei verwende ich den ganz normalen "Product" Block mit der Einstellung "Multiplication" auf Matrix. Wenn man nun einen "Constant" Block als Eingang der Multiplikation hat und dort einen Vektor angibt, dann funktioniert der Multiplication Block nur korrekt, wenn man beim Constant Block die Option "Interpret vector parameters as 1-D" deaktiviert. Wenn ich das mache, habe ich aber das Problem, dass der "To Workspace" Funktionsblock meinen Spaltenvektor aus dem Constant Block über die Zeit nicht mehr als [{Anzahl Samples},{Vektorlänge}] im Workspace speichert, sondern als [{Vektorlänge},1,{Anzahl Samples}] womit unter anderem der Plot Befehl nicht funktioniert. Wenn ich zwischen meinem Spaltenvektor und dem "To Workspace" noch einen "Transpose" Block zwischensetze, dann wird im Workspace die Dimension [1,{Vektorlänge},{Anzahl Samples}] gespeichert, womit ich immer noch nicht den Plot Befehl benutzen kann. Außerdem würde es auch falsch aussehen vor jeden "To Workspace" Block noch einen "Transpose" Block zu setzen. Gibt es eine saubere Lösung für das Problem? Vielen Dank im voraus!
Ohne zu wissen, warum es jetzt funktioniert: Wenn ich alle Spaltenvektoren auf "1D vector" stelle und diese Option für alle anderen Eingänge deaktiviere funktioniert sowohl die Multiplikation als auch der Plot. Vielleicht hat ja noch jemand eine verständliche Erklärung dafür. Danke und viele Grüße
Mal der Reihe nach Modularier schrieb: > Guten Abend, > > ich multipliziere in Simulink mit Matrizen umher. Dabei verwende ich den > ganz normalen "Product" Block mit der Einstellung "Multiplication" auf > Matrix. > Also eine "normale" Matrix Multiplikation. > Wenn man nun einen "Constant" Block als Eingang der Multiplikation hat > und dort einen Vektor angibt, dann funktioniert der Multiplication Block > nur korrekt, wenn man beim Constant Block die Option "Interpret vector > parameters as 1-D" deaktiviert. > Welche Rechenoperation möchtest du denn da ausführen? Gib mal ein Beispiel bitte. > Wenn ich das mache, habe ich aber das Problem, dass der "To Workspace" > Funktionsblock meinen Spaltenvektor aus dem Constant Block über die Zeit > nicht mehr als [{Anzahl Samples},{Vektorlänge}] im Workspace speichert, > sondern als [{Vektorlänge},1,{Anzahl Samples}] womit unter anderem der > Plot Befehl nicht funktioniert. Den genauen Grund kenne ich nicht, kann morgen erst wieder Simulink starten. Ein nicht so schöner Workaround wäre aber "transpose" und "squeeze", um die singleton dimension zu entfernen. > Wenn ich zwischen meinem Spaltenvektor und dem "To Workspace" noch einen > "Transpose" Block zwischensetze, dann wird im Workspace die Dimension > [1,{Vektorlänge},{Anzahl Samples}] gespeichert, womit ich immer noch > nicht den Plot Befehl benutzen kann. Außerdem würde es auch falsch > aussehen vor jeden "To Workspace" Block noch einen "Transpose" Block zu > setzen. > > Gibt es eine saubere Lösung für das Problem? Eine Behebung der Symptome steht oben, werde morgen mal nachgucken und versuchen das Problem zu reproduzieren. Hast du ne Modell Datei? > > Vielen Dank im voraus! Schöne Grüße!
Hallo Jan, ich möchte nach ihren ganz normalen mathematischen Definitionen Vektoren und Matrizen miteinander multiplizieren. Im Anhnag findest du eine mdl Datei. Ein Plot für c1 (den ich unbedingt möchte) (z.B. plot(c1) oder plot(t,c1)) funktioniert nur, wenn in "Constant1" "Interpret vector parameters as 1-D" aktiviert ist. Wenn dies der Fall ist, funktioniert die erste Matrix Multiply nur, wenn im Block "Constant" "Interpret vector parameters as 1-D" deaktiviert ist. Der Plot Befehl für "x" funktioniert ebenfalls nur, wenn "Constant2" diese Eigenschaft aktiviert hat. Auch bei größeren Projekten scheint diese Regel zu funktionieren: Bei allen Spaltenvektoren und skalaren Werten bleibt die "1-D Eigenschaft" aktiv, bei allen anderen Constant Blocks, also Matrizen und Zeilenvektoren wird die Eigenschaft deaktivert.
Hi, habe dein Modell angeguckt. Guck mal bitte hier: https://www.mathworks.com/matlabcentral/answers/98323-how-does-the-interpret-vector-parameters-as-1-d-option-affect-the-display-of-signal-values-and-the Das Verhalten ist erwünscht so. Das liegt daran, dass ja in dem Ausgangssignal irgendwie die Zeitabhängigkeit mit rein muss. In deinem Fall halt 10 Sekunden mit variablem Solver (ergibt bei mir 51 samples, kann je nach Simulink Version sicherlich unterschiedlich sein). Um die ursprüngliche Struktur deiner Eingangsdaten beizubehalten werden also die Ergebnisse (to Workspace) in der 3. Dimension übereinandergestapelt (cat(3,data1,data2,dataN)). Man könnte das auch in der ersten (also Zeilenweise) machen (das kann man auswählen). Dann wirds aber unübersichtlicher/falsch bei Matrizen. "interpret as 1-D" verhindert hingegen eine Matrix Interpretation deiner Daten. Es sind keine NxM Dimensionalen Arrays mehr, sondern eine eindimensionale Liste. Dass deine Matrixmultiplikation dann nur manchmal klappt ist klar - denn die Dimensionen müssen stimmen. Lass dir die Dimensionen mal anzeigen: Display->Signal&Ports->Signal Dimensions. Guck dir mal meinen Screenshot an. Wenn du also die Dimensionen deiner Daten beibehalten möchtest (was du bei Matrix Multiplikationen sicherlich tun willst!), lass den Haken bei "interpret as 1-D" weg! Tips: - Im "To workspace" Block besser nicht als Array, sondern als Struct oder Timeseries speichern. Dann hast du die Zeit gleich mit dabei und musst sie nicht über deine "Clock" speichern. Bestehst du auf "Array", dann nicht "inherit from input signal" auswählen, das wird bald entfernt. Entscheide dich, ob dein Array in der 1. oder 3. Dimension gestapelt werden soll. Ersteres führt aber zum Verlust der Struktur deiner Daten, du siehst nicht mehr, dass es mal Matrizen waren. - Blende die Dimensionen ein. - Was die Plots betrifft: Wie soll der Plot von c1 deiner Meinung nach aussehen? Du hast 51 samples, eines Vektors der Dimension [2x1]. Klar, dass plot() nicht funktioniert. Denn plot möchte in der ersten Dimension die samples (x-achse) und in der zweiten Dimension (Spalten) die Datensätze (werden in unterschiedlichen Farben angezeigt) haben. Möchtest du also, dass Constant1 als 2 unterschiedliche Datensätze geplottet wird, dann musst du die Dimensionen permutieren, denn sonst weiß plot() nicht, was es machen soll (was auch Sinn macht). Eine Idee ist plot(t, permute(c1, [3 1 2])). Damit packst du die 3. Dimension (== deine Samples über die Zeit) in die Zeilen (== erste Dimension) und in die 2. Dimension kommen die vorherigen Zeilen. Somit hast du eine Matrix mit den Dimensionen [51x2] und das kannst du wunderbar plotten. Andere Möglichkeit (aber mMn. nicht so eindeutig): plot(t, squeeze(c1)')
Hallo Jan, vielen Dank für deine Antwort! Ich werde mir das alles mal in Ruhe angucken. Grüße Modularier
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.