|
|
Poisson-Matrizen für eingige Wertepaare erstellen |
|
Matlab375 |
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.11.2019, 20:57
Titel: Poisson-Matrizen für eingige Wertepaare erstellen
|
|
|
|
|
Hallo,
ich arbeite seit einiger Zeit an einem Projekt und habe ursprünglich ausschließlich mit Excel (VBA) gearbeitet, jedoch schnell festgestellt, dass die Performance nicht ausreicht. Auch die Umsetzung mit R in R Studio war nicht zufriedenstellend. Da ich mir von der Leistung von Matlab einiges verspreche und nur wenig Erfahrung mit dem Programm habe, hoffe ich nun hier Hilfe zu finden.
Mein Problem (anhand von Excel verdeutlicht):
Ich habe zwei Spalten mit einigen Dezimalwerten in jeder Zeile.
Zusätzlich habe ich eine 22x22 Matrix in der auf der x-Achse Werte von 0 bis 20 iterieren, dasselbe auf der y-Achse. In der eigentlichen Matrix sind in jeder Zelle jeweils Multiplikationen von Poisson-Funktionen, die bei einem gegebenen Wertepaar (a,b) abhängig von dem jeweiligen Wert der x- bzw. y-Achse sind.
Beispiel der Formel in Zelle 1,1 der Matrix:
Dann wurden die Diagonale, der untere sowie der obere Teil der Ergebnisse der Matrix für ein gegebenes Wertepaar ( s.o. a,b in Formel) jeweils aufsummiert und die drei finalen Ergebnisse in die drei benachbarte Spalten in derselben Zeile der Eingabewerte a,b eingetragen. Dies wurde wiederholt für alle Werte a,b der beiden Spalten.
In R sah der Code wie folgt aus:
Nun zu Matlab:
Ich habe nun also die zwei Spalten den Variablen a und b zugeordnet (jeweils Spaltenvektor 300x1 double). Die integrierte poisspdf konnte mir gar nicht weiterhelfen:
Wenn ich
eingebe, kommt jedoch eine 6300x6300 große Matrix mit allen Ergebnissen raus. Ich würde jedoch gerne für jedes Wertepaar a,b eine separate Matrix erhalten und für jede Matrix die drei Teile (s.o.) aufsummieren bzw. die Ergebnisse in drei neuen Spalten bzw. Vektoren festhalten.
Kann mir irgendjemand weiterhelfen?
Vielen Dank im Voraus
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 27.11.2019, 21:53
Titel:
|
|
Hallo,
ich kann zugegebenermaßen nicht ganz folgen.
Wenn du aber die Ergebnisse schon in einer großen Matrix hast, dann sollten sich die gewünschten Infos auch extrahieren lassen. Wenn du also noch sagen kannst, mit welchem Teil der Matrix was gemacht werden soll...
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Matlab375 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.11.2019, 00:26
Titel:
|
|
Tut mir Leid, ich habe mich etwas umständlich ausgedrückt.
Also links in den gelben Spalten sind meine Eingabewerte a,b.
Für jede Zeile von a,b soll eine separate Matrix kalkuliert werden um schließlich die einzelnen farblichen Bereiche zu summieren (s.u.) und 3 Werte zu erhalten die dann in den roten Spalten präsentiert werden sollen.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.11.2019, 09:02
Titel:
|
|
Hallo,
was ich zu verstehen glaube ist, dass du am Ende eine Matrix von 5 Spalten haben willst. Was ich nicht verstehe ist, wie diese Spalten genau aus der unteren Matrix hervorgehen sollen. Da sind drei Bereiche markiert, soweit ich das erkennen kann, aber was soll mit diesen gemacht werden?
Wenn was summiert werden soll, wird das in irgendeiner Form auf den sum Befehl hinauslaufen.
Befehle wie diag, tril und triu können verwendet werden, um diese Bereiche zu extrahieren.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Matlab375 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.11.2019, 19:00
Titel:
|
|
|
|
|
Nein, ich habe zwei Spalten a,b mit (Eingabe-)Werten in allen 300 Zeilen.
Nehmen wir die Werte der ersten Zeile: 4 und 1
In der 21x21 Matrix werden diese beiden Werte dann per VBA in die Poisson-Formeln jeder Zelle eingesetzt. Also in jeder Zelle der 21x21 Matrix ist die Formel:
Hier wird dann für a in dem Beispiel 4 eingesetzt, für b die 1.
X und Z sind immer die äußeren Werte der jeweiligen Zeile bzw. Spalte in der 21x21 Matrix (grauer Rand), verändern sich also nicht.
In der ersten Zeile und ersten Spalte der 21x21 Matrix (ursprünglicher Post) steht das Resultat 0,0724398 welches auf folgender Kalkulation basiert
Eine Zeile darunter:
Eine Spalte daneben:
usw.
Abschließend werden die besagten Bereiche nach dem Schema tril, diag und triu summiert und die drei Ergebnisse in der derselben Zeile der Eingabewerte in den drei benachbarten Spalten eingetragen (roter Bereich).
Das gesamte oben beschriebene Procedere wiederholt sich dann für jede Zeile a,b.
Im zweiten Schritt würden also die Werte 0,0 aus Zeile 2 verwendet, d.h. in jede Zelle der 21x21 Matrix eingesetzt um wieder tril, diag und triu anzuweden um die Ergebnisse in Zeile 2 einzutragen (roter Bereich).
Viele Grüße und danke für die Geduld.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.11.2019, 19:24
Titel:
|
|
Hallo,
ich verwende VBA nicht, kann mit den darauf basierenden Beschreibungen also nur sehr begrenzt etwas anfangen. Kumuliert muss doch TRUE oder FALSE sein? Was ist es denn bei dir?
Meine Vermutung ist, dass du etwas folgender Art willst:
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Matlab375 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.11.2019, 19:47
Titel:
|
|
Ach das hatte ich total vergessen. Bei mir ist es FALSE. Dementsprechend hätte ich Poisspdf in Matlab. Damit hatte ich auch rumprobiert und u.a. den Fehler erhalten: non-scalar arguments must match in size.
Mein Problem ist vor allem das ich durch alle Zeilen laufen möchte.
Ich habe in Matlab zwei Spaltenvektoren (300x1 double) die alle Eingabewerte enthalten.
Den ersten Vektor habe ich der Variable a zugewiesen, den zweiten der Variable b.
Müsste ich dafür dann eine for-Schleife schreiben um für jedes a,b ein val1, val2, val3 zu erhalten?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.11.2019, 19:57
Titel:
|
|
Hallo,
Zitat: |
Damit hatte ich auch rumprobiert und u.a. den Fehler erhalten: non-scalar arguments must match in size. |
Dann wäre die entscheidende Frage, wie du das aufgerufen hast.
Zitat: |
Müsste ich dafür dann eine for-Schleife schreiben um für jedes a,b ein val1, val2, val3 zu erhalten? |
Wenn es ohne geht, ist eine for-Schleife tendenziell zu bevorzugen. Wenn nicht, dann in der Tat mit for-Schleife.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Matlab375 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.11.2019, 20:22
Titel:
|
|
Ich habe wie gesagt bereits den folgenden Code probiert, jedoch nur eine 6300x6300 Matrix erhalten:
wenn ich also eine Excel-Tabelle importiere und meine Variablen wie folgt aufsetze:
erhalte ich zwei Vektoren 300x1 double.
Zusätzlich setze ich
Mit einem anderen Code:
erhalte ich nur eine 21x21 Matrix anstelle von 300.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.11.2019, 20:44
Titel:
|
|
Hallo,
Zitat: |
erhalte ich nur eine 21x21 Matrix anstelle von 300. |
Dann musst du darüber eben eine for-Schleife machen.
Statt der beiden geschachtelten for-Schleifen kannst du ebenso gut das verwenden:
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Matlab375 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.11.2019, 21:08
Titel:
|
|
Ist dieser Code gemeint? ->
Damit erhalte ich nicht das passende Ergebnis (nur eine 21x21 Matrix). Ich habe leider keine Ahnung von Matlab.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.11.2019, 22:06
Titel:
|
|
Hallo,
du musst den Schleifeninhalt von i abhängig machen:
Für die Einarbeitung in MATLAB kann das Onramp hilfreich sein.
https://www.mathworks.com/learn/tutorials/matlab-onramp.html
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Matlab375 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 29.11.2019, 14:21
Titel:
|
|
Das ist grandios, DANKE! Ich bin von der Performance begeistert! Bekomme also eine Matrix die mehrere Matrizen enthält.
Letzte Frage: Wie kann ich dabei für jede Matrix dann noch die drei Summen bilden?
Mit:
erhalte ich einen Fehler (undefined function).
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 29.11.2019, 14:32
Titel:
|
|
Hallo,
eigentlich nur dasselbe weiter gezogen:
Statt 300 kann / sollte man auf die Dauer length(a) verwenden, um das flexibel zu halten.
Zitat: |
erhalte ich einen Fehler (undefined function). |
Bitte immer die vollständige Fehlermeldung posten.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Matlab375 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 27.11.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 29.11.2019, 18:26
Titel:
|
|
Hervorragend! So hatte ich mir das vorgestellt. Ich kann mich nicht genug bedanken!
Gruß
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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 - 2025
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.
|
|