|
|
Kombinationen von Vektorprodukten |
|
svenno |
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.06.2012, 10:58
Titel: Kombinationen von Vektorprodukten
|
|
|
|
|
Hallo zusammen,
habe erst vor kurzem mit Matlab angefangen, da ich für ein paper die Wahrscheinlichkeit des Ergebnisses einer Methodik berechnen und darstellen möchte (mit Hilfe eines Histogramms).
Folgendes Problem:
Vereinfacht gesagt habe ich zwei Zeilenvektoren:
a=[1,2,3,4,5,6,7,8,9]
b=[10,11,12,13,14,15,16,17,18]
Wenn ich nun a mit b multipliziere, erhalte ich ja nur die Einzelprodukte aus 1*10, 2*11, 3*12 usw.
Ich möchte aber gerne alle möglichen Kombinationen miteinander multiplizieren, als auch 1*11, 1*12 usw.
Momentan habe ich keine Ahnung wie ich das anstellen kann. Vielleicht kann/muss man aus den Zeilenvektoren jeweils eine Matrix erstellen so dass man für den obigen Vektor a also
1,2,3,4,5,6,7,8,9
2,3,4,5,6,7,8,9,1
3,4,5,6,7,8,9,1,2 usw
erhält.
Wenn man diese Matrizen dann miteinander multipliziert hätte man doch auch das gewünschte Ergebnis, oder? Vielleicht geht das aber auch noch sehr viel einfacher.
Ich danke euch schon mal für eure Hilfe!
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.06.2012, 11:05
Titel:
|
|
Hallo,
am einfachsten ist wohl:
Grüße,
Harald
|
|
|
svenno |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.06.2012, 12:09
Titel:
|
|
Danke schon mal. Allerdings funktioniert das nur für 2 Vektoren. Meine Formel besteht aber aus mehr als hundert Vektoren (inklusive Divisionen, Additionen etc), daher wird das so leider nicht klappen.
Gibt es noch eine andere Möglichkeit?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.06.2012, 13:51
Titel:
|
|
Hallo,
Zitat: |
Meine Formel besteht aber aus mehr als hundert Vektoren (inklusive Divisionen, Additionen etc), daher wird das so leider nicht klappen. |
Das ging leider aus deiner Frage nicht hervor. Auch wenn in der Formel über 100 Vektoren vorkommen, sind ja immer nur Operationen zwischen je zwei Vektoren möglich, und daraus ist das ganze dann zusammengesetzt. Alternativvorschlag also:
Hier kannst du auch @rdivide, @minus und @plus als Operation verwenden.
Wenn du das öfter brauchst, macht eine kleine Funktion das vielleicht übersichtlicher:
Aufzurufen z.B. mit
Grüße,
Harald
|
|
|
Bluesmaster |
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 07.06.2012, 14:00
Titel:
|
|
Geht so:
dabei erzeugt perms() genau die Matrix aus permutierten Zeilenvektoren.
So hat jede Zahl aus a jeder Zahl aus b mal die Handgeschüttelt.
(Vorausgesetzt beide Vektoren waren gleich lang)
remat baut dann aus b eine entsprechende Hilfsmatrix aus
("replicate Matrix")
Gruß
Blues
edit: Sorry @Harald für die Dopplung, ich war wohl einen Hauch zu spät
edit2: wobei die Permutation im Post vorher fehlt oder?
|
|
|
svenno |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.06.2012, 17:22
Titel:
|
|
Danke Harald und Blues,
das sind ja nun eine Menge Möglichkeiten. Ich probiers gleich mal aus.
Gruß
Svenno
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.06.2012, 18:26
Titel:
|
|
Hallo,
@ bluesmaster:
Ich habe meine Zweifel, dass das mit den Permutationen tatsächlich so gedacht war. Nach meinem Verständnis ging es nur darum, die Operation in allen möglichen Kombinationen von a und b durchzuführen.
Letztlich kann aber nur der Fragesteller sagen, was er eigentlich will
Grüße,
Harald
|
|
|
svenno |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.06.2012, 19:09
Titel:
|
|
nachdem ich mich nun schon mal wieder etwas weiter vorgekämpft habe kann ich auch sagen, dass perms nicht der richtige Befehl für mich zu sein scheint.
bsxfun(@times, repmat(a', 1, numel(b)), b)
scheint im bestimmten Bereich zu funktionieren. Bei einer längeren Formel wird der gesamte Term aber ziemlich lang, da man ja jeweils den Rechenschritt der vorherigen Rechnung als "b" einsetzen muss.
Deshalb hast du Harald ja auch wahrscheinlich die Funktion erwähnt. Leider fühle ich mich im Moment aber noch nicht sicher genug im Matlab, um auch das zu machen...step by step
|
|
|
svenno |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.06.2012, 19:35
Titel:
|
|
So...
Jetzt kann ich auch das neue Problem beschreiben.
Nachdem ich
bsxfun(@times, repmat(a', 1, numel(b)), b)
für die ersten Zeilenvektoren (á 9 Werte) benutzt habe, erhalte ich tatsächlich eine 9*9 Matrix die auch soweit das zu sein scheint, was ich brauche.
Nun habe ich aber das Problem beim weiterrechnen. diese Matrix kann ich nämlich nicht mit dem nächsten Zeilenvektor (á 9 Werte) multiplizieren. Das scheint nicht auf normale Weise (*) zu funktionieren, auch nicht wenn man den neuen Vektor als Spaltenvektor nutzt, weder mit dem bsxfun Befehl.
Wie kann ich also weiterrechnen?
|
|
|
svenno |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.06.2012, 19:47
Titel:
|
|
|
|
|
Zur Orientierung hier auch noch mal die Formel, die ich als erstes gerne nutzen würde: (a*b*c*1/(d*e))/f
Wenn ich das damit geschafft habe, gehe ich auch mal davon aus, dass ich den Rest hinbekomme.
Jeder der Variablen ist wie gesagt ein Zeilenvektor mit 9 Werten, da ich einen Mittelwert nutze und auf beiden Seiten eine Abweichung von +/- 20% in 5% Schritten. Macht also 9 Werte.
Über (a.*b.*c*1./(d.*e))./f kann man jetzt zwar alles multiplizieren, aber was ich gerne herausbekommen möchte, ist in welchem Bereich das Ergebnis am wahrscheinlichsten liegen wird, auch wenn einzelne Werte Abweichungen haben (Ungenauigkeit). Dafür möchte ich am Ende gerne ein Histogramm erstellen.
Da die Abweichung jedoch nicht immer gleichzeitig bei allen Werten + oder -20% ist, sondern hier mal +10% und da mal -15%, möchte ich also alle Werte miteinander kombinieren.
Ich hoffe, dass diese kurze Erklärung etwas Klarheit in die Sache gebracht hat.
Würde mich wirklich sehr freuen, wenn ihr mir bei der Lösung des Problemes helfen könntet.
Grüße
Svenno
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.06.2012, 20:25
Titel:
|
|
Hallo,
Zitat: |
was ich gerne herausbekommen möchte, ist in welchem Bereich das Ergebnis am wahrscheinlichsten liegen wird, auch wenn einzelne Werte Abweichungen haben (Ungenauigkeit). Dafür möchte ich am Ende gerne ein Histogramm erstellen. |
Es wäre gut gewesen, das von Anfang an zu wissen. Was ich machen würde: 100000 Zufallszahlen für a-f generieren (Gleichverteilung oder Normalverteilung, RAND bzw. RANDN?) und dann ein Histogramm der Ergebnisse machen.
Grüße,
Harald
|
|
|
svenno |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.06.2012, 21:58
Titel:
|
|
Könnte man dabei festlegen, in welchem Berich die Zufallszahlen der einzelnen Variablen liegen sollen? Mit welchem Befehl kann ich das machen?
Danke und Gruß
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.06.2012, 22:33
Titel:
|
|
Hallo,
in der Doku von RAND bzw. RANDN findest du Beispiele, wie du die Zufallszahlen durch Addition oder Skalierung auf einen passenden Bereich transformieren kannst.
Grüße,
Harald
|
|
|
svenno |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 10
|
|
|
|
Anmeldedatum: 07.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 08.06.2012, 09:14
Titel:
|
|
Hallo Harald,
vielen Dank für die Hilfe. So funktionierts
Zur Bestimmung der Abweichung bei den jeweiligen Variablen benutze ich nun also nicht mehr diese 9 Werte, sondern erstelle mit
(2*rand(100000,1)-1) bzw.
(randn (100000,1)/3.5) um ungefähr im Bereich zwischen -1 und 1 zu landen,
die entsprechenden Werte .
Klappt super!
Danke noch mal allen!
|
|
|
Bluesmaster |
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 08.06.2012, 15:54
Titel:
|
|
Oh verstehe, ich hatte gedacht mit Kombinationen ist gemeint:
jedes Element aus a soll einmal mit jedem Element aus b verküpft werden
mein Fehler
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|