Forum: Digitale Signalverarbeitung / DSP / Machine Learning MatLab Vektoren


von Sebastian (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine dringende Frage zu MatLab. Wenn ich einen Zeilenvektor U = 
[U1 U2 ... U8] und eine Variable Len_U, die die Länge dieses Vektors 
enthält, in Matlab definiere. Was für ein Ergebnis bringt diese Zeile:

U = [U ones(Len_U,1)];

Der Befehl ones() erzeugt eine Matrize deren Elemente 1 sind, demzufolge 
müsste ones(Len_U,1) einen Spaltenvektor mit 8 Elementen, die 1 sind 
zurückgeben. Oder liege ich da falsch?

Spanne ich in diesem Fall eine neue Matrix mit 9 Spalten und 8 Zeilen

=> [U1, U2, U3, U4, U5, U6, U7, U8, 1; 0, 0, 0, 0, 0, 0, 0, 0, 1; ...]

Ich habe von Matrizenrechnung in MatLab nicht so viel Erfahrung, deshalb 
bin ich für jede Hilfe dankbar.

von Delete M. (skywalker)


Lesenswert?

Sebastian wrote:
> Der Befehl ones() erzeugt eine Matrize deren Elemente 1 sind, demzufolge
> müsste ones(Len_U,1) einen Spaltenvektor mit 8 Elementen, die 1 sind
> zurückgeben. Oder liege ich da falsch?
Das ist richtig.

> Spanne ich in diesem Fall eine neue Matrix mit 9 Spalten und 8 Zeilen
>
> => [U1, U2, U3, U4, U5, U6, U7, U8, 1; 0, 0, 0, 0, 0, 0, 0, 0, 1; ...]
Was genau ist jetzt deine Frage bzw. dein Problem? Was möchtest du mit U 
machen?

von Sebastian (Gast)


Lesenswert?

Vielen Dank. Wollte wissen ob meine Überlegungen richtig sind. Aber sie 
sind es wohl :-).

von Delete M. (skywalker)


Lesenswert?

Wenn du dir unsicher bzgl. eines bestimmten Befehls bist, so kannst du 
ihn auch einfach im Command Window testen. Meistens, aber nicht immer, 
findet man dann raus wie man den Befehl richtig benutzt. ;)

von Sebastian (Gast)


Lesenswert?

Ja, das Problem ist, dass ich ein M-File habe, dass ich in eine andere 
Programmiersprache übersetzen möchte. Warum ich dieses übersetzen möchte

->->->->-> Ich habe kein Matlab

von gast (Gast)


Lesenswert?

Mit

U = [A B];

kannst du nur Vektoren/Matrizen mit gleicher Anzahl an Zeilen verbinden. 
Wenn dein U aber eine Zeilenvektor ist (1x8) und dein ones einen 
Spaltenvektor liefert, geht das nicht.

von Sebastian (Gast)


Lesenswert?

Okay,

ich werde genauer. Ich möchte mein M-File in C übersetzen. Da ich kein 
MatLab besitze, kann ich auch nicht den Kompiler von MatLab benutzen um 
den Code in C zu überführen (laut Google geht das nänmlich).

So zurück zum Sachverhalt:

U ist ein Zeilenvektor mit 8 Elementen.

Der M-File-Code sieht wie folgt aus ->

...

Len_U = length(U);

...

U = [U ones(Len_U,1)];

...

Wie muss ich mir nun die Matrix U nach der unteren Zuweisung vorstellen?

Wird eine Matrix durch die beiden Vektoren aufgespannt?

Werden an den Zeilenvektor U Elemente drangehängt?

Ich bin jetzt ein bißchen ratlos. Vielleicht könnte einer mal die zwei 
Zeilen in MatLab reintippen und mir das Ergebnis verraten.

Und ja ich würde gerne MatLab selber besitzen, aber die Übersetzung von 
M-Files ist leider kein privates Projekt :-).

von Delete M. (skywalker)


Lesenswert?

Also ich habs mal eingetippt und es kommt folgendes raus:
1
>> U = [1 2 3 4 5 6 7 8]
2
3
U =
4
5
     1     2     3     4     5     6     7     8
6
7
>> Len_U = length(U);
8
>> U = [U ones(Len_U,1)];
9
??? Error using ==> horzcat
10
All matrices on a row in the bracketed expression must have the 
11
 same number of rows.

Lautet der Code wirklich so? Denn wenn ich ihn leicht ändere:
1
>> U = [U ones(Len_U,1)'];
2
>> U
3
4
U =
5
6
     1     2     3     4     5     6     7     8     1     1     1     1     1     1     1     1

(Beachte das ' hinter ones(Len_U,1); das nimmt die transponierte 
Matrix.)
Wird hinter dem U ein Komma eingefügt, so kommt das selbe raus. Das 
Komma in MatLab bedeutet, dass die Elemente in der nächsten Spalte 
angeordnet werden. Setzt man dagegen ein Semikolon, so werden die Einsen 
in die zweite Zeile geschrieben (Semikolon in MatLab bewirkt neue Zeile 
in Matrix).

Den Befehl U = [U ones(Len_U,1)]; interpretiere ich so, dass die neue 
Matrix U aus dem alten Zeilenvektor U und einem Einsvektor der Größe 8 
Zeilen/1 Spalte bestehen soll. Das geht so natürlich nicht, weil du 
nicht einfach eine Zeile mit einer Spalte zusammenmeiern kannst. Setzt 
du den Befehl so an:
U = [U ones(1,Len_U)];
Dann kommt ebenfalls wieder eine einzige lange Zeile heraus. In dem Fall 
fügst du eine Zeile an eine Zeile an.

Übrigends findest du unter folg. Link die MatLab-Online-Hilfe:
http://www.mathworks.com/access/helpdesk/help/techdoc/
Die ist weitestgehend identisch mit der Hilfe im Programm und sehr 
hilfreich.

Ich hoffe das hilft dir soweit erstmal weiter.

von Sebastian (Gast)


Lesenswert?

Danke für die Hilfe.

Das mit dem transponieren einer Matrix wusste ich schon. Aber trotzdem 
danke für die (Online-)hilfe. Ich werde weiter nach dem Fehler suchen 
und wenn ich den Fehler entdeckt habe, werde ich um den Thread am Leben 
zu erhalten die Lösung des Fehlers hier posten.

von Detlef _. (detlef_a)


Lesenswert?

>>Wenn ich einen Zeilenvektor U = [U1 U2 ... U8] und eine Variable Len_U,

Die Zeile

>> U = [U ones(Len_U,1)];
macht Sinn, wenn U ein Spaltenvektor ist. Dann 'stelltst' Du 'rechts' 
neben den 'stehenden' Spaltenvektor einen zweiten gleichlangen aus 
Einsen. Das braucht man oft, z.B. sieht die Matrix zum least square 
Lösen eines überbestimmten Gleichungssystems so aus.

>>Beachte das ' hinter ones(Len_U,1); das nimmt die transponierte Matrix.)

Vorsicht bei dem Operator ' . Der transponiert und bildet das 
konjugiert komplexe. Wenn man nur transponieren will lautet der Operator 
.'  . Ich glaube, dass diese Eigenschaft schon hunderttausende Stunden 
Debugarbeit gekostet hat.

Cheers
Detlef

von Sebastian (Gast)


Lesenswert?

Vorsicht bei dem Operator ' . Der transponiert und bildet das
konjugiert komplexe. Wenn man nur transponieren will lautet der Operator
.'  . Ich glaube, dass diese Eigenschaft schon hunderttausende Stunden
Debugarbeit gekostet hat.



Danke,

da wär ich echt darüber gestolpert.

von gast (Gast)


Lesenswert?

Poste doch mal den ganzen Abschnitt des m-files, dann gehts einfacher.

von Sebastian (Gast)


Lesenswert?

Ja, sehe ich ein, aber wie gesagt, ist es kein privates Projekt. Und 
wenn ich das mache hängt mein Chef mich an den ... auf. Und wie ich 
finde dann auch zurecht:-)

von Sebastian (Gast)


Lesenswert?

Okay,

hier noch ein Auszug ausgeschnittener Programmtext:

nve = [1 2 3 4 5 6 7 8]

...

for i:size(U,1)

   U(i,:) = U(i,:)./nve;

end

...

Ich bin mir jetzt echt nicht mehr sicher ob U ein Zeilenvektor ist. Habe 
ich so gesagt bekommen. In Matlab gibt es ja leider keine genauen 
Variablendefinitionen, die aussagekräfitg sind. Okay hat auch den 
Vorteil sich nicht mit viel Syntax herumschlagen muss, aber des Einen 
Freud, des Anderen...

Bei jedem Schleifendurchlauf wird die Zeile von U mit der Zeile von nve 
elementweise dividiert. Ich dachte halt, dass MatLab nach dem Ersten 
Durchlauf abbricht, weil U ja ein Zeilenvektor ist. Hat für mich auch 
Sinn gemacht weil der Schleifenindex ja nicht in nve verwendet wird.

Irgendjemand eine Idee??

von Detlef _. (detlef_a)


Lesenswert?

>>Ich bin mir jetzt echt nicht mehr sicher ob U ein Zeilenvektor ist

U hat size(U,1) - Zeilen und 8 Spalten.
Dein Code dividiert alle Zeilen von U elementweise durch nve 
(vermutlich, die  abgetippte Syntax ist fehlerhaft).

Cheers
Detlef

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn du kein MATLAB hast, nimm Octave. Code aus einer Sprache zu 
portieren die man nicht kann ist schwer genug, aber wenn man den 
Originalcode nicht mal zum Verstehen und zur Verifikation ausführen kann 
wird es ein Stochern im Nebel.

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.