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

Sigma eines normierten 2d-gaussian bei gegebener Amplitude

 

MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2010, 18:56     Titel: Sigma eines normierten 2d-gaussian bei gegebener Amplitude
  Antworten mit Zitat      
Moin Leude,

hab mir jetzt den Kopf zerbrochen und eigentlich kann mein Problem doch nicht so schwer sein oO

Ich möchte einen 2D Gaussian berechnen, dazu hab ich folgende Funktion:
Code:
function Z = buildGaussian(A, x0, y0, sigma_x, sigma_y)
theta = rand*2*pi;
a = cos(theta).^2/(2*sigma_x^2) + sin(theta).^2/(2*sigma_y^2);
b = -sin(2*theta)/(4*sigma_x^2) + sin(2*theta)/(4*sigma_y^2);
c = sin(theta).^2/(2*sigma_x^2) + cos(theta).^2/(2*sigma_y^2);

[X, Y] = meshgrid(floor(x0-3*sigma_x):ceil(x0+3*sigma_x),...
    floor(y0-3*sigma_y):ceil(y0+3*sigma_y));
Z = A*exp( - (a*(X-x0).^2 + 2*b*(X-x0).*(Y-y0) + c*(Y-y0).^2));
end
was ich jetzt aber möchte ist, dass ich nur A,x0 und y0 angebe und mir das sigma (der einfachheit soll erstmal sigma_x = sigma_y sein, später wärs auch schick, wenn er mir alle Lösungen ausspuckt) berechnet wird, bei dem das Integral über den Gaussian den Wert 1 annimmt, bzw. einen von mir definierten Wert wär am besten!

Hab versucht es Symbolisch über int() und solve() zu lösen, er bricht mir aber mit der Meldung ab, dass er keine explizite Lösung finden kann.

Hab jetzt auf http://en.wikipedia.org/wiki/Gaussian_function gelesen, dass das Integral
Code:
ist, weiss aber nicht wie in diesem Fall A aussehn würde?

Hat einer nen Tipp, wie ich dieses Problem lösen kann?
Private Nachricht senden Benutzer-Profile anzeigen


MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 15:52     Titel:
  Antworten mit Zitat      
push
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.07.2010, 16:24     Titel:
  Antworten mit Zitat      
Hallo,

wenn sich die Lösung nicht symbolisch finden lässt, versuchs doch numerisch? Ansonsten muss ich sagen, dass ich aus der Frage nicht schlau werde.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 23:10     Titel:
  Antworten mit Zitat      
ein 2D-Gauss definiert sich doch über seine Amplitude A am Punkt (x0,y0) und die Standardabweichung Sigma. Der so erzeugt Gauss besitzt dann ein definiertes Volumen, sein Integral.

Was ich möchte ist, eine Amplitude am Punkt (x0,y0) und das Integral vorgeben und mir das dazu nötige Sigma berechnen lassen.

Ich dachte das würde so gehn, dass ich z.B int(gauss(A,x0,y0))=1 mit A=1, x0 = 0 und y0 = 0 setzte und dann das ganze nach sigma auflöse?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.07.2010, 10:44     Titel:
  Antworten mit Zitat      
Hallo,

und wenn das symbolisch nicht geht, weil die Formeln zu kompliziert werden würden, dann mach es eben numerisch - z.B. mit quad oder quadgk und fzero.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2010, 15:57     Titel:
  Antworten mit Zitat      
mhh, du meinst quasi das dann iterativ zu lösen? das integral mit quad berechnen und sigma so lange ändern bis quad das von mir gewünschte Integral liefert?

Problem dürfte da der Zeitaufwand werden, wenn ich 1000de von Gauss auf diese Weise berechne -.-
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.07.2010, 16:13     Titel:
  Antworten mit Zitat      
Hallo,

nicht Tausende. fzero dürfte mit ca. 10 Iterationen auskommen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2010, 18:43     Titel:
  Antworten mit Zitat      
sorry, versteh es nicht, fzero sucht ja nach Nullstellen, wie hilft mir das weiter? meinst du ich soll den Wendepunkt suchen? kannst du vielleicht kurz anzeigen wie der Code dazu aussehn würde? weil ich steh voll auf dem Schlauch
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.07.2010, 20:08     Titel:
  Antworten mit Zitat      
Hallo,

in deinem Beispiel eine Nullstelle von int(gauss(A,x0,y0))-1 suchen,
etwa so:
Code:
fzero(@quadgk(...) - 1, 1)


Detaillierter gehts, wenn die Frage etwas genauer gestellt wird (welches Integral soll 1 sein, was sind die Parameter, was ist gesucht).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2010, 22:37     Titel:
  Antworten mit Zitat      
okay, das versteh ich jetzt, nur leider hackt es jetzt an der implementierung arghh

hab der einfachheit wegen mal meine gaussfunktion umgeschrieben
Code:

function Z = buildGaussian(x, A, x0, y0,sigma)
Z = A*exp(-((x-x0).^2+(x'-y0).^2)/sigma);
end

wenn ich jetzt aber deinen vorschlag anwenden möchte
Code:
fzero(@quadgk(buildGaussian(repmat(-5:5,11,1),1,0,0,1)-1,-inf,inf),1)

kommt immer
Code:
??? fzero(@quadgk(buildGaussian(repmat(-10:10,21,1),1,0,0,0.63)-1,-inf,inf),1)
                 |
Error: Unbalanced or unexpected parenthesis or bracket.

habs dann so versucht
Code:
fzero(@quadgk,buildGaussian(repmat(-5:5,11,1),1,0,0,1)-1,-inf,inf,1)
dann kommt aber
Code:
Error using ==> fzero at 439
Second argument must be of length 1 or 2.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.07.2010, 23:36     Titel:
  Antworten mit Zitat      
Hallo,

mein Eindruck ist, dass da bei dir jetzt einiges durcheinander ging. So gehts:
Code:
A = 1;
x0 = 0;
y0 = 0;
tic; fzero(@(sigma) quadgk(@(x) buildGaussian(x, A, x0, y0, sigma), -inf, inf)-1, 1); toc

Ich gehe davon aus, dass deine buildGaussian von dem ' nach x abgesehen stimmt. Oder willst du da eigtl Doppelintegrale berechnen?? Dann stimmt die buildGaussian nicht, und du solltest dblquad verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2010, 01:43     Titel:
  Antworten mit Zitat      
erstmal vielen dank harald! hab jetzt was stehn, dass auch läuft
Code:
locPrec = fzero(@(sigma) dblquad(@(x,y)...
    buildGaussian(x,y, signal, 0, 0, sigma),...
    -15, 15, -15, 15)-10^2, sqrt(signal));
leider ist es recht langsam, wenn man an die 100-1000 Sigmas auf diese Weise berechnen möchte, aber jetzt hab ich was mit dem kann ich erstmal weiterarbeiten...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.08.2010, 10:20     Titel:
  Antworten mit Zitat      
Hallo,

ich hab mir deinen ursprünglichen Beitrag noch einmal angesehen und würde sagen, dass A = [ a b; b c ] ist. Vergleich das doch mal für einen Satz a,b,c und schau, ob das stimmt. Wenn ja, kannst du ja immer mit der Wiki-Formel rechnen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2010, 17:55     Titel:
  Antworten mit Zitat      
moin, habs mal ausprobiert, und die Integral die mit dblquad liefert mit dem Integral der Formel auf Wiki verglichen, wenn signal = 2*sigma ist kommt das gleiche Volumen raus, ansonsten unterscheiden sich die Ergebnisse oO hab auch mal Versucht nen Gauss auf diese Weise zu erzeugen, das klappt leider gar nicht, also im mom totale sackgasse aber ich poste mal das letzte
Code:
function test
signal = 6;
sigma = 3;

int1 = dblquad(@(x,y)...
    buildGaussian(x,y, signal, 0, 0, sigma),...
    -15, 15, -15, 15)

theta = 0;
a = cos(theta)^2/(2*sigma^2) + sin(theta)^2/(2*sigma^2);
b = -sin(2*theta)/(4*sigma^2) + sin(2*theta)/(4*sigma^2);
c = sin(theta)^2/(2*sigma^2) + cos(theta)^2/(2*sigma^2);
int2 = pi/sqrt(det([a, b; b, c]))
end

function Z = buildGaussian(x, y, A, x0, y0,sigma)
Z = A*exp(-((x-x0).^2+(y-y0).^2)/sigma);
end

function Z = buildGaussian2(a,b,c)
[X Y] = meshgrid(0:.1:5);
x = [X(:) Y(:)]';
A = [a, b; b, c];
Z = exp(-x'*A*x);
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.08.2010, 18:28     Titel:
  Antworten mit Zitat      
Hallo,

solltest du deine Werte a,b,c nicht in das Doppelintegral reinstecken? Die Berechnung mit dblquad scheint mir davon unabhängig. Vielleicht nochmal einen Schritt zurück und überlegen, was du nun eigtl berechnen willst?

Grüße,
Harald
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 - 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.