Forum: Digitale Signalverarbeitung / DSP / Machine Learning Matrizenmultiplikation in Matlab Simulink


von Modularier (Gast)


Lesenswert?

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!

von Modularier (Gast)


Lesenswert?

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

von Jan K. (jan_k)


Lesenswert?

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!

von Modularier (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Jan K. (jan_k)


Angehängte Dateien:

Lesenswert?

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)')

von Modularier (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.