MatLab Vektoren

Gast #1242734
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.
#1242998
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?
Gast #1243821
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 :-).
#1243862
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.
#1244050
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
Gast #1244173
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??

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren