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.
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?
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. ;)
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
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.
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 :-).
Lautet der Code wirklich so? Denn wenn ich ihn leicht ändere:
1
>>U=[Uones(Len_U,1)'];
2
>>U
3
4
U=
5
6
1234567811111111
(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.
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.
>>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
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.
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:-)
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??
>>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
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.