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

m file in c code exportieren

 

reimpirat
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 17.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2014, 14:07     Titel: m file in c code exportieren
  Antworten mit Zitat      
Hi, ich habe ein Problem beim exportieren einer Funktion in C Code,
leider gibt es einen Fehler beim function_handler.

Könnt ihr mir helfen und kennt ihr noch eine Möglichkeit, wie ich meine Funktion doch noch exportieren kann?

Code:

function [ beta ] = multiLatNonLinearFit( data, start )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
   
    modelFun = @(b,data) sqrt((b(1)-data(:,1)).^2+(b(2)-data(:,2)).^2);
    nlm = NonLinearModel.fit(data,data(:,3),modelFun,start);
   
    beta = nlm.Coefficients.Estimate;
 


Vielen Dank schonmal Smile
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.08.2014, 14:38     Titel: Re: m file in c code exportieren
  Antworten mit Zitat      
Hallo reimpirat,

Welche Fehlermeldung bekommst Du denn?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
reimpirat
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 17.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2014, 14:43     Titel:
  Antworten mit Zitat      
Oh total vergessen.

Ich bekomme diese Fehlermeldung:

Code:

??? This kind of expression is not supported.

Error in ==> multiLatNonLinearFit Line: 5 Column: 16
 
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 17.08.2014, 20:25     Titel:
  Antworten mit Zitat      
Anonymous Funktionen werden vom C-Coder nicht unterstützt.
Schreib einfach eine 2. Funktion unter deine erste Funktion und beende die erste mit einem end.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
reimpirat
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 17.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2014, 22:04     Titel:
  Antworten mit Zitat      
Danke für die Antwort, jedoch bekomme ich immer noch folgende Fehlermeldung :
Code:
??? This kind of expression is not supported.


Ich habe jetzt jede Funktion in eine eigene Datei geschrieben, aber ich habe nicht ganz verstanden, wie ich mit einer 2. Funktion die @-Funktion umgehen soll.

Habe es so versucht, jedoch ein kein Erfolg:
http://www.mathworks.com/matlabcent.....es-to-extrinsic-functions

Meine Hauptfunktion:

Code:

function [ beta ] = multilat( data, start )
   
    func = @(b) myfun(b, data);
   
    nlm = nlfit(data, func, start);

    beta = nlm.Coefficients.Estimate;
   
end

 


Meine 2 Unterfunktionen:

Code:

function [ nlm ] = nlfit( data, func, start )

    nlm = NonLinearModel.fit(data,data(:,3),func,start);
   
end
 


Code:

function [ F ] = myfun(b, data)

F = sqrt((b(1)-data(:,1)).^2+(b(2)-data(:,2)).^2);

end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 17.08.2014, 22:16     Titel:
  Antworten mit Zitat      
Erstmal würde ich alles in eine Datei schreiben.

Code:

function [ beta ] = multilat( data, start )
   
    % wo kommt b her?
    return_myfunc = myfun(b, data);
   
    nlm = nlfit(data, return_myfunc, start);

    % wo kommt die class her?
    beta = nlm.Coefficients.Estimate;
   
end

function [ nlm ] = nlfit( data, func, start )

    % vermutlich ist wird die class vom c-coder auch nicht unterstützt
    nlm = NonLinearModel.fit(data,data(:,3),func,start);
   
end

function [ F ] = myfun(b, data)

F = sqrt((b(1)-data(:,1)).^2+(b(2)-data(:,2)).^2);

end
 


1. Ich kann diese Funktion mit einem >> multilat(rand(3,3), 3) auch nichtmals ausführen, da ich über die Klassen nicht verfüge. Vermutlich wird diese auch nicht vom C-Coder unterstützt.

2. Benutzt du immer noch eine Anonyme Funktion vergleich Zeile 4 mit Zeile 3 deiner multilat Funktion. Und Variable b ist mir in diesem Kontext auch etwas schleiferhaft.

Diese zwei Sachen musst du lösen, und dann gucken an welcher Stelle der C-Coder wieder meckert Wink I.d.R. muss man z.B. die ganzen Outputs (in deinem Fall nlm, beta ...) preallocieren. In Matlab ist alles schwach typisiert, in C alles strickt.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
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: 17.08.2014, 23:11     Titel:
  Antworten mit Zitat      
Hallo,

ich kann nur empfehlen, erst mal zu schauen, was bei MATLAB Coder alles unterstützt wird:
http://www.mathworks.de/de/help/sim.....on--categorical-list.html

Da NonLinearModel.fit nicht in der Liste auftaucht, ist es für die Codegenerierung nicht unterstützt. Vermutlich wird es dir nicht helfen, die Funktion als extrinsisch zu definieren? Alternativ kann man höchstens den Umweg über fminsearch gehen, was seit kurzem (R2014a?) unterstützt wird.

Mal eine ganz andere Frage: warum möchtest du daraus denn Code generieren?

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 17.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2014, 00:05     Titel:
  Antworten mit Zitat      
Die Funktion als extrinsisch zu definieren habe ich versucht, hat leider auch nicht geholfen.

Der Code soll später auf einem Mikrocontroller laufen, deshalb brauche ich ihn in C. Ich dachte ich könnte mir Arbeit sparen indem ich die Matlab Funktion benutze, anstatt einen eigenen Algorithmus zu schreiben, da NonLinearModel.fit genau mein Problem löst. Leider zu früh gefreut Sad


Die Option mit fminsearch sieht interessant aus, danke für den Tipp. Vielleicht kann das mir ja wenigstens etwas Arbeit abnehmen.

Auf jeden Fall schon mal danke, für die schnelle und gute Hilfe hier im Forum, falls ich noch eine Möglichkeit finde, werde ich sie posten.
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: 18.08.2014, 09:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Funktion als extrinsisch zu definieren habe ich versucht, hat leider auch nicht geholfen.


Auch wenn es zunächst klappen würde, hilft es ja nichts, wenn der Code letztlich auf dem Mikrocontroller laufen soll. Es bleibt also nur die Umformulierung.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 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.