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?
Vielen Dank. Wollte wissen ob meine Überlegungen richtig sind. Aber sie sind es wohl :-).
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 :-).
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.