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 in C++ umsetzen

 

EinHauchvonTyll
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 30.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2011, 08:58     Titel: MATLAB in C++ umsetzen
  Antworten mit Zitat      
Hi Leute ich habe die Aufgabe bekommen ein Programm das mit C++ für Matlab geschrieben ist in reines C++ um zusetzen.

Das ich die MexFunktion zu Main machen muss weiß ich schon nur weiß ich nicht wie ich die mxArrays die dabei angenommen werden in C++ geschrieben werden oder ob ich das überhaupt benötige.

Code:
void _tmain(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])


Außerdem konnte ich bis jetzt nicht den Matlabbefehl "mxGetPr" für entsprechend C++ finden.

Vielen Dank Schon mal für eure Hilfe.
Ich hoffe ich habe es verständlich beschrieben bei Problemen bitte dazu schreiben .
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: 30.09.2011, 10:40     Titel: Re: MATLAB in C++ umsetzen
  Antworten mit Zitat      
Hallo EinHauchvonTyll,

Die Arrays, die man in C++ verwendet, entsprechen den Ausgaben von mxGetPr(), nämlich Zeiger auf die Nutz-Daten. Wenn ich es richtig verstehe, musst Du also alles vor mxGetPr "einfach weglassen".

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 30.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2011, 10:51     Titel:
  Antworten mit Zitat      
Aber mxGetPr hat doch gar nichts mit den Arrays zu tun soweit ich weiß reserviert dieser Befehl Speicher im RAM nur weiß ich nicht wie dieser Vorgang(Fachbegriff) heißt so das ich nicht nach dem passenden C++ Befehl suchen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

in der Regel wird das Programm wohl so aussehen:

Code:
mexFunction (.....)

1. Auslesen der Daten aus prhs

2. Arbeiten mit den Daten

3. Setzen der Daten in plhs


Wenn du 1. und 3. weglässt, sollte der relevante Codeteil übrig bleiben. Dann musst du dir nur noch über Input und Output der Funktion Gedanken machen, und dabei sollten 1. und 3. hilfreich sein: alles, was aus prhs rausgeholt wird, ist ein Input - alles, was in plhs reingeschrieben wird, ist ein Output.

mxGetPr gibt einen Zeiger auf die in den Variablen enthaltenen Daten zurück. Die Variablen enthalten meist noch mehr Informationen, wie z.B. die Dimensionen.

Grüße,
Harald
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: 30.09.2011, 14:01     Titel:
  Antworten mit Zitat      
Hallo EinHauchvonTyll,

Alle Matlab Variablen haben den Typ mxArray. Darin ist ein Header enthalten, der die Dimension, den Daten-Typ, die Anzahl der Verlinkungen zu anderen Variablen, den Namen, im Falle von Structs auch eine Liste der Fieldnames, und einige magische Flags speichert. Wichtig die Bearbeitung in C++ ist:
1. der Pointer auf die eigentlichen Nutz-Daten. Dieser wird für DOUBLE-Arrays mit mxGetPr geliefert, für alle anderen Daten-Typen geht das per mxGetData.
2. die Dimension des Arrays, welche von mxGetNumberOfDimensions und mxGetDimensions bestimmt wird.

mxGetPr reserviert also keinen Speicher (das macht mxMalloc), sondern liefert den Pointer auf den bereits allozierten Speicher mit den Nutz-Daten.

Beispiel:
Code:
% In Matlab:
a = [1.7, -5.2];
% ==> Aufruf der Mex-Funktion:
myMexFunc(a);

% In der Mex-Funktion:
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
  double *data;
  data = mxGetPr(prhs[0]);
 
  fprintf("%g\n", data[0]);  % ==> 1.7
  fprintf("%g\n", data[1]);  % ==> -5.2
}

Idealerweise steht in der mexFunction nur Code um die Anzhal und den Typ des Inputs zu testen und die Dimensionen und Pointer auf die Daten zu erhalten. Dies wird dann an eine Unterfunktion übergeben, die dann von Matlab unabhängig ist - es sei denn, es werden Matlab-API-Funktionen aufgerufen, etwa mxMalloc, mexPrintf, mxIsNaN, etc.

Kennst Du die Beispiel-Mex-Files aus der Matlab-Dokumentation?

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 30.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2011, 14:04     Titel:
  Antworten mit Zitat      
Also das möchte ich in C++ umsetzen

Code:
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{    
    // Winsock initialisieren
    if (initWinsock() != 0) {
        mexPrintf("No connect\n"); return;
    }
   
    // Output vorbereiten
    plhs[0] = mxCreateDoubleScalar(mxREAL);
    sockNUC = mxGetPr(plhs[0]);
    nlhs = 1; // Anzahl Output-Argumente für MatLab
   
    // Connect durchführen
    if (connectNUC() == 0)
    {
        mexPrintf("Successfully connected to NUC server\n");
    }
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: 30.09.2011, 14:28     Titel:
  Antworten mit Zitat      
Hallo EinHauchvonTyll,

Hier gibt es ein grundsätzliches Problem: Die Inputs der C++-main-Funktion sind vom Type CHAR und die Ausgabe ist VOID. Wie möchtest Du diese Funktion dann aufrufen?

Gruß, Jan
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.