mexCallMatlab mit mehreren Inputs



  • Hallo!

    Ich möchte gerne mexCallMatlab aufrufen. Bei einer Inputvariablen habe ich ein Beispiel gefunden. Bei mehreren weiß ich aber nicht, wie das gehen soll. Ich möchte gerne zwei Matrizen p, t (nicht quadratisch) und ein Skalar T eingeben. Also Output möchte ich die Matrix DS haben. Bei einer Inputvariablen erstellt man für diese ein Array und schmeißt es rein. Aber, wie verknüpfe ich jetzt meine drei Variablen zu einem Array? Bitte helft mir.
    SchwerpunktDreieck ist dabei eine Matlabfunktion, die dabei eben diese drei Eingabevariablen und eine Ausgabevariable hat, [DS] = SchwerpunktDreieck(p,t,T);

    #include <math.h>
    #include "mex.h"
    
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
        // Fange Fehler ab
        if (nrhs == 0)
        mexErrMsgTxt("Fehler: Keine Eingabeparameter");
    
        // Makros für vereinfachte Eingabe
        #define DS_OUT plhs[0]
        #define p_IN prhs[0]
        #define t_IN prhs[1]
        #define T_IN prhs[2]
    
        // Definiere Variablen
        double *DS, *p, *t;
        int p_r, p_s, t_r, t_s;
        int n;
    
        mxArray *Output[1];
        mxArray *Input[3];
        double *InPtr = null;
    
        // Irgendwas mit mxGetPr ?
        // ...
    
        EP[0] = &p_IN;
        EP[1] = &t_IN;
        EP[2] = &T_IN;
    
        // Ermittle Dimensionen von p und t
        p_r = mxGetM(p_IN);
        p_s = mxGetN(p_IN);
    
        t_r = mxGetM(t_IN);
        t_s = mxGetN(t_IN);
    
        // Erstelle DS
        DS_OUT = mxCreateDoubleMatrix(t_s, 2, mxREAL);    
        DS = mxGetPr(DS_OUT);  
    
       for(n = 0; n < t_s; n++) { 
            mexCallMATLAB(1, AP, 3, &EP ,"SchwerpunktDreieck");
       }
    
       return;
    
    }
    


  • RobertB schrieb:

    Ich möchte gerne mexCallMatlab aufrufen. Bei einer Inputvariablen habe ich ein Beispiel gefunden. Bei mehreren weiß ich aber nicht, wie das gehen soll. Ich möchte gerne zwei Matrizen p, t (nicht quadratisch) und ein Skalar T eingeben. Also Output möchte ich die Matrix DS haben. Bei einer Inputvariablen erstellt man für diese ein Array und schmeißt es rein. Aber, wie verknüpfe ich jetzt meine drei Variablen zu einem Array?

    Ich finde deinen Code ehrlich gesagt ziemlich konfus und kann den nicht ganz zu deiner Frage zuordnen.

    Deine drei Parameter sind mxArray-Pointer, richtig? Also baust du dir ein Array mit diesen drei Pointern und übergibst es:

    mxArray *inputs[3] = { p, t, T };
    mexCallMATLAB(3, inputs, ...);
    

    BTW hier geht es um reines C++, nicht um die Benutzung irgendwelcher externen Bibliotheken/APIs. Stelle bitte nächstes Mal die Frage unter "Rund um die Programmierung".



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Bashar schrieb:

    BTW hier geht es um reines C++, nicht um die Benutzung irgendwelcher externen Bibliotheken/APIs. Stelle bitte nächstes Mal die Frage unter "Rund um die Programmierung".

    Zumal es anscheinend reines C ist.



  • Soll in der mex-Funktion noch mehr gemacht werden als das? Weil so ist es ja sehr albern überhaupt den Umweg über eine mex-Funktion zu gehen.



  • Ich vereinfache mal den Code:

    #include <math.h>
    #include "mex.h"
    #include <string.h>
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
        // Fange Fehler ab
        if (nrhs == 0)
        mexErrMsgTxt("Fehler: Keine Eingabeparameter");
    
        // Makros für vereinfachte Eingabe
        #define w_OUT plhs[0]
        #define u_IN prhs[0]
        #define v_IN prhs[1]
    
        mxArray *result;
        mxArray *arguments[2];
    
        arguments[0] = mxCreateDoubleMatrix(1, 2, mxREAL);
        arguments[1] = mxCreateDoubleMatrix(1, 2, mxREAL);
    
        memcpy(mxGetPr(arguments[0]), u_IN, sizeof(double)*1*2);
        memcpy(mxGetPr(arguments[1]), v_IN, sizeof(double)*1*2);
    
        mexCallMATLAB(1,&result,2,arguments,"conv");
    
        w_OUT = result;
        return;
    
    }
    

    Jetzt nur noch zwei Eingabevariablen, eine Ausgabevariable. Richtig ist das aber noch nicht. Als Ausgabe kommt ein 1x3-Nullvektor heraus. Wenn man da aber zwei 1x2-Vektoren eingibt, verschieden von 0, sollte da was anderes herauskommen. Kann ich überhaupt

    w_OUT = result;
    

    schreiben?



  • Tim schrieb:

    Soll in der mex-Funktion noch mehr gemacht werden als das? Weil so ist es ja sehr albern überhaupt den Umweg über eine mex-Funktion zu gehen.

    Ich habe ein größeres Projekt in Matlab geschrieben. Die For-Schleifen (bottlenecks?) möchte ich aber in C++ schreiben.



  • Ich habe das Programm jetzt zum richtigen Laufen gebracht. Aber ich bin für Verbesserungsvorschläge dankbar! Es scheint wohl noch sehr umständlich zu sein.

    #include <math.h>
    #include "mex.h"
    #include <string.h>
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
        // Fange Fehler ab
        if (nrhs == 0)
        mexErrMsgTxt("Fehler: Keine Eingabeparameter");
    
        // Makros für vereinfachte Eingabe
        #define w_OUT plhs[0]
        #define u_IN prhs[0]
        #define v_IN prhs[1]
    
        double *u, *v, *w;
        u = mxGetPr(u_IN);
        v = mxGetPr(v_IN);
    
        mxArray *result[1];
        mxArray *arguments[2];
    
        arguments[0] = mxCreateDoubleMatrix(1, 2, mxREAL);
        arguments[1] = mxCreateDoubleMatrix(1, 2, mxREAL);
    
        memcpy(mxGetPr(arguments[0]), u, sizeof(double)*1*2);
        memcpy(mxGetPr(arguments[1]), v, sizeof(double)*1*2);
    
        mexCallMATLAB(1,result,2,arguments,"conv");
    
        w_OUT = result[0];
        return;
    
    }
    

Anmelden zum Antworten