mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP MatLab Vektoren


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Delete Me (skywalker)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

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

Autor: Delete Me (skywalker)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-).

Autor: Delete Me (skywalker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habs mal eingetippt und es kommt folgendes raus:
>> U = [1 2 3 4 5 6 7 8]

U =

     1     2     3     4     5     6     7     8

>> Len_U = length(U);
>> U = [U ones(Len_U,1)];
??? Error using ==> horzcat
All matrices on a row in the bracketed expression must have the 
 same number of rows.

Lautet der Code wirklich so? Denn wenn ich ihn leicht ändere:
>> U = [U ones(Len_U,1)'];
>> U

U =

     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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste doch mal den ganzen Abschnitt des m-files, dann gehts einfacher.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:-)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.