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

Matlab Code aufrufen OHNE code generation Probleme

 

SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2018, 12:53     Titel: Matlab Code aufrufen OHNE code generation Probleme
  Antworten mit Zitat      
Ich habe ein Simulink Model mit dem Block "MATLAB function". In dem zugehörigen Code mache ich sehr viele Berechnungen und ich hangele mich jetzt schon seit Stunden von einer Fehlermeldung zur anderen, weil viele Befehle und Schreibweisen nicht so funktionieren wie gewohnt. Alles wegen dieser Code Generation. Gibt es keine Möglichkeit einfach Matlab Code so wie er ist in Simulink einzubinden oder aufzurufen?
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: 09.01.2018, 14:59     Titel:
  Antworten mit Zitat      
Hallo,

du kannst die Funktion in eine eigene .m-Datei (hier: myfunction) auslagern, sie in der MATLAB Function als extrinsisch deklarieren und dann von dort aufrufen:

Code:
function y = fcn(u)

y = 0; % "Deklaration" von y
coder.extrinsic('myfunction')
y = myfunction(u);


Dabei musst du lediglich die Ausgabeargumente "deklarieren".

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

Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2018, 16:30     Titel:
  Antworten mit Zitat      
Super, vielen Dank das funktioniert jetzt endlich!

Eine weitere Frage hätte ich noch. Ich definiere mir zu Beginn eine Struktur in der ich meine Daten (Koordinaten) speicher. Dazu verwende ich bisher folgendes Ungetüm:

Code:
detList=struct('xpos',{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
    },'ypos',0,'zpos',0);


Das Problem hier ist auch wieder die Code Generation, die verlangt, dass die Variable "deklariert" wird. Mit folgendem kürzeren und schönerem Code funktioniert es aber leider nicht:

Code:
coder.extrinsic('zeros')
coder.extrinsic('num2cell')
detList=struct('xpos',num2cell(zeros(1,100)),'ypos',0,'zpos',0);


Fehlermeldung dabei:

Subscripted assignment into an mxArray is not supported for code generation.

Weißt du dafür vielleicht auch noch eine schnelle und elegante Lösung? Perfekt wäre es, wenn die Struktur nicht länger auf eine bestimmte Anzahl begrenzt wäre sondern eine variable Größe hätte.
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: 09.01.2018, 17:25     Titel:
  Antworten mit Zitat      
Hallo,

ich sehe zwei Möglichkeiten:
a) versuch mal etwas wie repmat({0}, 1, 100)
b) auch das in die ausgelagerte Funktion ziehen. Klappt aber nur, wenn das kein Rückgabeargument der Hauptfunktion ist

Wenn das nicht weiterhilft, wäre noch ein reproduzierbares Beispiel hilfreich. Dann schaue ich mal, ob ich das hinbiegen kann.

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

Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2018, 17:50     Titel:
  Antworten mit Zitat      
Mit repmat() hat es jetzt funktioniert. Nochmals vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
SigiSorglos
Themenstarter

Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2018, 17:42     Titel:
  Antworten mit Zitat      
Ich habe jetzt in der Funktion y=myfunction(u) den folgenden Befehl:

Code:
Tabelle=readtable('FileName.csv')


dieser wird jetzt für jeden Zeitschritt des Simulink-Modells einmal ausgeführt. Das ist aber nicht notwendig, da sich der Inhalt nicht ändert. Ich habe versucht diese Zeile zu kopieren und in die Callback Function (InitFcn, StartFcn, und andere) einzufügen. Allerdings bekomme ich trotzdem immer die Fehlermeldung, dass "Tabelle" nicht definiert ist. Gibt es eine Möglichkeit dieses Problem zu lösen?
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: 10.01.2018, 17:56     Titel:
  Antworten mit Zitat      
Hallo,

du kannst in der MATLAB Function oben im Toolstrip auf "Edit Data" gehen und dort Parameter anlegen. Das könnte aber wieder mit der Codegenerierung Probleme machen.

Besser ist es vielleicht, in deiner eigenen Funktion Tabelle als persistent zu definieren.

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

Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2018, 10:29     Titel:
  Antworten mit Zitat      
Bei mir hat es jetzt folgendermaßen funktioniert:

Code:
persistent Tabelle
 if isempty(Tabelle)
    Tabelle=readtable('FileName.csv');
 end


Vielen Dank nochmal!
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.