Verfasst am: 25.07.2017, 17:56
Titel: Definieren von variable-sized globals für MEX
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: ---
Verfasst am: 01.08.2017, 16:18
Titel:
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];
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
MexIt
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.08.2017, 11:36
Titel:
vergessen wir das mit den globals... Daher habe ich ja ein zweites Beispiel mit Beispielcode aufgesetzt. Kannst du mir da weiterhelfen?
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
Einstellungen und Berechtigungen
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
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.