2016-07-13 19 views
1

bekam ich eine typische CPP-Funktion in Matlab mex mitzuordnen float * oder int * zu mxArray

#include "mex.h" 

void func (int * rowvec, int * colvec, float * valvec, int * nnz){/*fill arguments*/} 



void mexFunction(int nlhs, mxArray *plhs[], 
       int nrhs, const mxArray *prhs[]) 

wo ich überprüfen, ob in Ich habe genug Ausgangsgrößen verfügbar

if(nlhs != 4) { 
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs", 
        "Four outputs required."); 
} 

Außerdem in dieser Funktion deklarieren ich vier Variablen:

int *rowvec;  /* 1st output array */ 
int *colvec;  /* 2nd output array */ 
float *valvec;  /* 3rd output array */ 
int *nnz;   /* 4th output scalar */ 

Sie werden in einer Funktion definiert/gefüllt werden:

func(rowvec, colvec, valvec, nnz) //arguments get filled with values 

Jetzt möchte ich, so etwas tun:

plhs[0] = rowvec; 
plhs[1] = colvec; 
plhs[2] = valvec; 
plhs[3] = nnz; 

Es leider vier verständlich Fehler wirft, denn das sind zwei verschiedene Datentypen. Die Fehler sind wie folgt:

cannot convert ‘int*’ to ‘mxArray* {aka mxArray_tag*}’ in assignment plhs[0] = rowvec; 

Wie kann ich das beheben?

+0

Ich schreibe dies in Matlab, aber es ist eine C++ - Datei, ich habe es nach diesem Tutorial getan: http://de.mathworks.com/help/matlab/matlab_external/standalone-example.html – SemtexB

Antwort

1

Sie haben einen Schritt verpasst.

Sie müssen mxCreateNumericArray verwenden und das Ihren Ausgangsargumenten zuweisen.

Verwenden Sie dann mxGetData für die erstellten Arrays und setzen Sie Ihre int/float-Zeiger darauf.

Dann rufen Sie func, um die Ausgänge zu füllen.

Wenn Sie die Schnittstelle ändern können, sollten Sie stattdessen func (plhs) in Betracht ziehen. Sie müssen die Größe der Ausgabearrays kennen, bevor Sie die Zeiger verwenden können.

+0

Soweit Ich verstehe 'ndim' und' dims' repräsentieren die Größe von, in diesem Fall, 'rovec', oder? Aber was, wenn ich die Größe von rowvec zu dieser Zeit nicht kenne? Eigentlich ist '* nnz' ein 'int'-Skalar und repräsentiert die Länge der drei Vektoren' rowvec', 'colvec' und' valvec'. – SemtexB

+0

Hast du meine Bearbeitung vermisst? Wenn die func-Schnittstelle festgelegt ist, führen Sie die mxArray-Erstellung nach und kopieren Sie die Daten. – TWhelan

+0

Ok, wenn es keine andere Möglichkeit gibt, werde ich es kopieren. Vielen Dank! – SemtexB