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

fminsearch -> "only accepts inputs of data type doub

 

dennisMUC

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2011, 12:09     Titel: fminsearch -> "only accepts inputs of data type doub
  Antworten mit Zitat      
Hallo.

Ich komme mit meinem kleinen MATLAB programm nicht mehr weiter.
fminsearch wird für eine nicht-lineare Optimierung verwendet.

Googlen nach der Fehlermeldung hat mich weiter gebracht.

main.h:
Code:
%Main Routine für nicht-lineare Optimierung

%Daten einlesen aus "parameter.dat"
fid = fopen('parameter.dat');
C = textscan(fid, '%s %s %f32');
fclose(fid);

dpx = C{3}(1);
dpy = C{3}(2);
k1  = C{3}(3);
k2  = C{3}(4);
p1  = C{3}(5);
p2  = C{3}(6);
k3  = C{3}(7);
fx  = C{3}(8);
fy  = C{3}(9);
cx  = C{3}(10);
cy  = C{3}(11);
width = C{3}(12);
height = C{3}(13);

%Sample-Data in Abhängigkeit von width, height der Kamerakalibrierung
for i=1:10
    u(i) = (width / (10+1)) * i;
    v(i) = (height / (10+1)) * i;
end

%Startwerte der Optimierung
x0 = [1 0.1 1 width/2 height/2];

x = fminsearch(@myoptimize, x0, [], u, v);
 


myoptimize.h
Code:
function y = myoptimize(x,u,v)

f = x(1);
kappa = x(2);
sx = x(3);
cx_tsai = x(4);
cy_tsai = x(5);

sum = 0;

for i = 1:length(u)

    [xc,yc,zc] = img2world_zhang(u(i),v(i),k1,k2,p1,p2,cx,cy,fx,fy);    
    [us,vs] = world2img_tsai(f,kappa,sx,dpx,dpy,xc,yc,zc,cx_tsai,cy_tsai);
    sum = sum + (pow(u(i)-us,2) + pow(v(i)-vs,2));
   
end;

y = sum;


img2world_zhang & world2img_tsai funktionieren bei manuellem Aufruf und geben korrekte Werte aus.

Ich habe ein ähnliches Beispiel Programm mit fminsearch, welches tadellos funktioniert:

main-routine:
Code:
X = [-5.3, -1.3, -0.5, 0.7, 1.0, 7.7];
Y = [-28.335, 5.5489, 5.248, 5.127, 5.5, 182.759];
res = fminsearch(@errFctPoly, [0.,0.,0.,0], [], X, Y)


Code:
function f = errFctPoly( a, X, Y )

    res = 0;
    for i = 1:6
   
        res = res +  (Y(i) - (a(1) + a(2)*X(i) + a(3)*X(i)^2 + a(4)*X(i)^3))^2;

    end

    f = res;


Leider bringe ich den Tranfer auf das erste Programm nicht hin.
Kann mir jemand weiterhelfen?

Grüße aus München,
Dennis


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.10.2011, 12:52     Titel:
  Antworten mit Zitat      
Hallo,

bekommst du denn tatsächlich noch die im Titel angegebene Fehlermeldung? Du solltest dir darüber im klaren sein, dass du FMINSEARCH in einer Form verwendest, die nicht dokumentiert ist und daher immer ein gewisses Risiko birgt.
Zusätzliche Parameter übergibt man normalerweise in einer anderen Form, siehe die Beispiele in der Doku zu FMINSEARCH.

In myoptimize verwendest du diverse Variablen, die nicht übergeben werden. Meine Empfehlung wäre, sämtliche Parameter (dpx, dpy) etc. in eine Struktur zu packen und sie als zusätzlichen Parameter zu übergeben - wenn es funktioniert, dann ebenso wie u und v, andernfalls wie in der Doku beschrieben.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2011, 16:26     Titel:
  Antworten mit Zitat      
Hallo Harald.

Vielen Dank erstmal für deine prompte Antwort.
Leider komme ich mit deiner Erläuterung nicht zurecht.

Die im Titel angeführte Fehlermeldung "FMINSEARCH only accepts inputs of data type double" bekomme ich nach Ausführen der obersten Mainroutine.

(Mein Fehler im übrigen, daß ich sie hier .h genant habe, muss natürlich .m heißen)

Ich konnte mich wie gesagt, nur an das untere einfachere Programm halten und mit meiner Problemstellung verknüpfen.

Ich weiß aus der Dokumentation, daß die korrekte Syntax
Code:
x = fminsearch(fun,x0,options)
lauten müsste. Wobei die options in der "Optimization Options Reference" erläutert werden.

Mit einer Struktur habe ich bisher auch noch nicht gearbeitet und ich würde es gerne vermeiden eine neue Baustelle aufzumachen.

Vielen Dank nochmal für deine Mühen!
 
Harald
Forum-Meister

Forum-Meister


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

meine Befürchtung ist, dass diese undokumentierte Syntax in dem einfachen Fall funktioniert, im komplexeren aber nicht.

Bei einer derartigen Menge an Parametern ist das Arbeiten mit einer Parameterstruktur am sinnvollsten. In deinem Fall benötigst du nur zwei Notationen:
Code:
param.feld = daten; % belegen eines Feldes einer Struktur
daten = param.feld; % extrahieren der Informationen


Probier also bitte folgendes:
Im Hauptcode anlegen der Struktur und modifizierter Aufruf:

Code:
param.dpx = C{3}(1);
param.dpy = C{3}(2);
...
param.height = C{3}(13);

%Sample-Data in Abhängigkeit von width, height der Kamerakalibrierung
for i=1:10
    param.u(i) = (width / (10+1)) * i;
    param.v(i) = (height / (10+1)) * i;
end

x = fminsearch(@(x) myoptimize(x, param), x0, [], u, v);


Die Funktion sollte dann so aussehen:
Code:
function y = myoptimize(x,param)

...

summe = 0;

for i = 1:length(u)

    [xc,yc,zc] = img2world_zhang(param.u(i),param.v(i),param.k1,...);    
    [us,vs] = world2img_tsai(f,kappa,sx,param.dpx,param.dpy,...);
    summe = summe + (pow(u(i)-us,2) + pow(v(i)-vs,2));
   
end;

y = sum;


Langfristig wäre es natürlich gut, auch die Hilfsfunktionen so umzuschreiben, dass du nicht alle Argumente einzeln, sondern vielleicht zwei Strukturen - eine mit den Variablen, eine mit den Parametern - übergibst.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2011, 00:09     Titel:
  Antworten mit Zitat      
Vielen Dank nochmal für deinen Beitrag, Harald.
Ich bin dem Fehler selber auf die Schliche gekommen, ich hätte mich nur mehr auf die Fehlermeldung an sich versteifen sollen.
Deine allgemeinen Programmiertips haben meinem Code mehr Struktur verschafft, hat sich also trotzdessen gelohnt hier zu posten.

Zur Lösung des Problems:
fminsearch benötigt unbedingt double-Werte als Startwerte.
in meinem Fall musste ich also aus width/2 und height/2 -> double(width/2) und double(height/2) machen.
 
Neues Thema eröffnen Neue Antwort erstellen



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.