WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Poisson-Matrizen für eingige Wertepaare erstellen

 

Matlab375
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2019, 20:57     Titel: Poisson-Matrizen für eingige Wertepaare erstellen
  Antworten mit Zitat      
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:
Code:
= POISSON(0;a;FALSE) * POISSON(0;b;FALSE)


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:
Code:

a <- Table$ValueA
b <- Table1$ValueB
lapply(a,function(a) {lapply(b,function(b) {outer(dpois(0:20,a), dpois(0:20,b))})})


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

Code:
% Poisson pmf
fh =@(k,lam) ((lam.^k).*exp(-lam))./factorial(k);    % k is integer

A3 = fh(X,a);
B3 = fh(X,b);
M3 = A3(:)*B3(:).';


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
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2019, 21:53     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab375
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2019, 00:26     Titel:
  Antworten mit Zitat      
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.

Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2019, 09:02     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab375
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2019, 19:00     Titel:
  Antworten mit Zitat      
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:

Code:
POISSON(x;a;Kumuliert)*POISSON(z;b;Kumuliert)
 


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

Code:
POISSON(0;a;Kumuliert)*POISSON(0;b;Kumuliert)
 


Eine Zeile darunter:

Code:
POISSON(1;a;Kumuliert)*POISSON(0;b;Kumuliert)


Eine Spalte daneben:

Code:
POISSON(0;a;Kumuliert)*POISSON(1;b;Kumuliert)


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2019, 19:24     Titel:
  Antworten mit Zitat      
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:

Code:
x = 0:20;
z = (0:20)';
M = poisscdf(x, 4).*poisscdf(z, 1);

val1 = sum(triu(M),'all')
val2 = sum(diag(M),'all')
val3 = sum(tril(M),'all')


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab375
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2019, 19:47     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2019, 19:57     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab375
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2019, 20:22     Titel:
  Antworten mit Zitat      
Ich habe wie gesagt bereits den folgenden Code probiert, jedoch nur eine 6300x6300 Matrix erhalten:

Code:
% Poisson pmf
fh =@(k,lam) ((lam.^k).*exp(-lam))./factorial(k);  

A = fh(X,a);
B = fh(X,b);
M = A(:)*B(:).';
 


wenn ich also eine Excel-Tabelle importiere und meine Variablen wie folgt aufsetze:

Code:
a = Datei.WerteA
b = Datei.WerteB
 


erhalte ich zwei Vektoren 300x1 double.

Zusätzlich setze ich

Code:


Mit einem anderen Code:

Code:
M = zeros(numel(X));
for ii = 1:numel(X)
    for jj = 1:numel(X)
        M(ii,jj) = poisspdf(X(ii),a)*poisspdf(X(jj),b);
    end
end


erhalte ich nur eine 21x21 Matrix anstelle von 300.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2019, 20:44     Titel:
  Antworten mit Zitat      
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:
Code:
M = poisspdf(X', a).*poisspdf(X, b);


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab375
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2019, 21:08     Titel:
  Antworten mit Zitat      
Ist dieser Code gemeint? ->

Code:
for i = 1:300
M = poisspdf(X', a).*poisspdf(X, b)
end


Damit erhalte ich nicht das passende Ergebnis (nur eine 21x21 Matrix). Ich habe leider keine Ahnung von Matlab.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2019, 22:06     Titel:
  Antworten mit Zitat      
Hallo,

du musst den Schleifeninhalt von i abhängig machen:
Code:
M = cell(1,300);
for i = 1:300
M{i} = poisspdf(X', a(i)).*poisspdf(X, b(i))
end


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab375
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2019, 14:21     Titel:
  Antworten mit Zitat      
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:

Code:

M = cell(1,300);
for i = 1:300
M{i} = poisspdf(X', a(i)).*poisspdf(X, b(i))

s1 = sum(triu(M),'all');
s2 = sum(diag(M));
s3 = sum(tril(M),'all');

end
 


erhalte ich einen Fehler (undefined function).
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.11.2019, 14:32     Titel:
  Antworten mit Zitat      
Hallo,

eigentlich nur dasselbe weiter gezogen:

Code:
M = cell(1,300);
s1 = zeros(1,300);
s2 = zeros(1,300);
s3 = zeros(1,300);

for i = 1:300
M{i} = poisspdf(X', a(i)).*poisspdf(X, b(i));

s1(i) = sum(triu(M{i}),'all');
s2(i) = sum(diag(M{i}));
s3(i) = sum(tril(M{i}),'all');

end


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab375
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 27.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2019, 18:26     Titel:
  Antworten mit Zitat      
Hervorragend! So hatte ich mir das vorgestellt. Ich kann mich nicht genug bedanken!

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.