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)')
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang