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

Definieren von variable-sized globals für MEX

 

MexIt

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2017, 17:56     Titel: Definieren von variable-sized globals für MEX
  Antworten mit Zitat      
Hallo,
ich versuche ein Matlabfile in ein MEX-file umzuwandeln. Dabei geht es um eine Funktion in der globale Variablen (Verwendung von globals lässt sich nicht umgehen) existieren, derem Größe innerhalb der Funktion variiert.
"Normale" Variablen lassen sich mit coder.varsize('x') einfach definieren und stellen bei der Umwandlung kein Problem dar. Nur wie funktioniert das mit globalen Variablen, deren Größe sich während der Berechnung ändert? Können diese irgendwie in ein MEX-File umgewandelt werden? Bekomme die Meldung:

"coder.varsize() has no effect on global variables.
Use a coder.Type inside the command-line -globals switch to define variable-size globals."

Die Meldung hilft mir aber irgendwie nicht weiter. Was ist damit gemeint?
Danke schonmal!


MexIt

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2017, 16:18     Titel:
  Antworten mit Zitat      
hmm, gibt es keinen, der mir helfen kann?

Nochmal eine Alternative, wie es auch gehen würde: Ich könnte die Variablen als nicht global definieren und später übertragen.
Dazu definiere ich mit Coder.varsize('Variable') Variablen, deren Größe sich ändert. Mit der double 1x1 Variable x funktioniert das auch, nur für y (1x6) erhalte ich folgende Errormessage:
"Coder Error: Dimension 1 is fixed on the left-hand side but varies on the right ([1 x :?] ~= [:? x :?])."

Ohne coder.varsize erhalte ich folgende Errormessages:
"Dimension 1 is fixed on the left-hand side but varies on the right ([1 x 1] ~= [:? x 1])."
Dimension 1 is fixed on the left-hand side but varies on the right ([1 x 6] ~= [:? x 6]).

Hier ein Ausschnitt meines Codes:
Code:

coder.varsize('x');
coder.varsize('y');
x=0;
x_init=0;
y=[z1,z2,z3,z4,z5,z6];
for i=1:6
      y_init=y(end,:);
      [a,b] = ode23(@(x,y) fun(x,y),[p(i),p(i+1)],y_init,options);
end
x=[x;a];
y=[y;b];
 


Was ist das Problem?
 
MexIt

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2017, 16:03     Titel:
  Antworten mit Zitat      
Hiiilfeeee!! : )
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Verwendung von globals lässt sich nicht umgehen

Ich habe bisher keine Anwendung kennengelernt, in der das nicht möglich war.

Hast du es mal mit coder.Type versucht wie in der Fehlermeldung vorgeschlagen?

Am besten ist es, wenn du ein komplett reproduzierbares Beispiel zur Verfügung stellst. Bei mex ist das ja z.B. immer eine Funktion. Versuchst du im Command Window oder mit der Coder App zu kompilieren? Letzteres ist oft einfacher.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.08.2017, 11:36     Titel:
  Antworten mit Zitat      
vergessen wir das mit den globals... Daher habe ich ja ein zweites Beispiel mit Beispielcode aufgesetzt. Kannst du mir da weiterhelfen?
 
Harald
Forum-Meister

Forum-Meister


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

wie gesagt:
Zitat:
Am besten ist es, wenn du ein komplett reproduzierbares Beispiel zur Verfügung stellst. Bei mex ist das ja z.B. immer eine Funktion. Versuchst du im Command Window oder mit der Coder App zu kompilieren? Letzteres ist oft einfacher.

Was sind insbesondere die Eingabeargumente deiner Funktion? Deren Dimensionen?

Sind die p Unstetigkeitsstellen? Dann kann es besser sein, das über eine Event-Funktion zu behandeln als den Integrator jedes Mal neu zu starten.

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.