Mentions légales du service

Skip to content
Snippets Groups Projects
Commit fe2d51a5 authored by Nicolas Bellot's avatar Nicolas Bellot Committed by hhakim
Browse files

wrapper matlab : compatibilite matrice sparse et complexe

parent 4460c123
Branches
Tags
No related merge requests found
...@@ -149,7 +149,7 @@ namespace Faust ...@@ -149,7 +149,7 @@ namespace Faust
template<typename FPP1> template<typename FPP1>
MatSparse(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_, const FPP1* value, const int* row_ptr, const int* id_col); MatSparse(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_, const FPP1* value, const int* row_ptr, const int* id_col);
void set(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_, const double* value, const size_t* id_row, const size_t* col_ptr); void set(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_, const FPP* value, const size_t* id_row, const size_t* col_ptr);
void resize(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_); void resize(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_);
void resize(const faust_unsigned_int dim1_, const faust_unsigned_int dim2_){mat.resize(dim1_,dim2_);update_dim();} void resize(const faust_unsigned_int dim1_, const faust_unsigned_int dim2_){mat.resize(dim1_,dim2_);update_dim();}
void setZeros(){mat.setZero();nnz=0;} void setZeros(){mat.setZero();nnz=0;}
......
...@@ -250,7 +250,7 @@ Faust::MatSparse<FPP,Cpu>::MatSparse(const Faust::MatDense<FPP,Cpu>& M) : ...@@ -250,7 +250,7 @@ Faust::MatSparse<FPP,Cpu>::MatSparse(const Faust::MatDense<FPP,Cpu>& M) :
template<typename FPP> template<typename FPP>
void Faust::MatSparse<FPP,Cpu>::set(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_, const double* value, const size_t* id_row, const size_t* col_ptr) void Faust::MatSparse<FPP,Cpu>::set(const faust_unsigned_int nnz_, const faust_unsigned_int dim1_, const faust_unsigned_int dim2_, const FPP* value, const size_t* id_row, const size_t* col_ptr)
{ {
resize(0,0,0); resize(0,0,0);
resize(nnz_,dim1_,dim2_); resize(nnz_,dim1_,dim2_);
......
...@@ -100,12 +100,10 @@ void mxArray2FaustMat(const mxArray* Mat_array,Faust::MatDense<std::complex<FPP> ...@@ -100,12 +100,10 @@ void mxArray2FaustMat(const mxArray* Mat_array,Faust::MatDense<std::complex<FPP>
*/ */
template<typename FPP> template<typename FPP>
void mxArray2FaustspMat(const mxArray* spMat_array,Faust::MatSparse<FPP,Cpu> & S); void mxArray2FaustspMat(const mxArray* spMat_array,Faust::MatSparse<FPP,Cpu> & S);
template<typename FPP>
void mxArray2FaustspMat(const mxArray* Mat_array, Faust::MatSparse<std::complex<FPP>,Cpu> & Mat)
{mexErrMsgTxt("mxArray2FaustspMat (complex scalar) not yet implemented");}
// ptr_data will be allocated in this function
template<typename FPP> template<typename FPP>
void mxArray2Ptr(const mxArray* mxMat, FPP* & ptr_data); void mxArray2Ptr(const mxArray* mxMat, FPP* & ptr_data);
template<typename FPP> template<typename FPP>
......
...@@ -271,26 +271,26 @@ void mxArray2FaustspMat(const mxArray* spMat_array,Faust::MatSparse<FPP,Cpu> & S ...@@ -271,26 +271,26 @@ void mxArray2FaustspMat(const mxArray* spMat_array,Faust::MatSparse<FPP,Cpu> & S
"input array must be sparse"); "input array must be sparse");
} }
//check scalar compayibility
if (!isScalarCompatible(S,spMat_array))
mexErrMsgTxt("mxArray2FaustspMat scalar type (complex/real) are not compatible");
int nnzMax = mxGetNzmax(spMat_array); int nnzMax = mxGetNzmax(spMat_array);
int nbCol = mxGetN(spMat_array); int nbCol = mxGetN(spMat_array);
int nbRow = mxGetM(spMat_array); int nbRow = mxGetM(spMat_array);
//mexPrintf("DIM (%d,%d) NNZMAX : %d\n",nbRow,nbCol,nnzMax); //mexPrintf("DIM (%d,%d) NNZMAX : %d\n",nbRow,nbCol,nnzMax);
size_t* jc,*ir; size_t* jc,*ir;
double* pr; FPP* ptr_data;
//jc = (size_t *) mxCalloc(nbCol+1,sizeof(size_t)); //jc = (size_t *) mxCalloc(nbCol+1,sizeof(size_t));
jc = (size_t *)mxGetJc(spMat_array); jc = (size_t *)mxGetJc(spMat_array);
//ir = (size_t *) mxCalloc(nnzMax,sizeof(size_t)); //ir = (size_t *) mxCalloc(nnzMax,sizeof(size_t));
ir = (size_t *) mxGetIr(spMat_array); ir = (size_t *) mxGetIr(spMat_array);
//pr = (double *) mxCalloc(nnzMax,sizeof(double)); //pr = (double *) mxCalloc(nnzMax,sizeof(double));
pr = (double *) mxGetPr(spMat_array); mxArray2Ptr(spMat_array,ptr_data);
S.set(nnzMax,nbRow,nbCol,pr,ir,jc); S.set(nnzMax,nbRow,nbCol,ptr_data,ir,jc);
if(ptr_data) {delete [] ptr_data ; ptr_data = NULL;}
//mxFree(jc); //mxFree(jc);
//mxFree(ir); //mxFree(ir);
//mxFree(pr); //mxFree(pr);
...@@ -414,7 +414,14 @@ void mxArray2Ptr(const mxArray* mxMat, std::complex<FPP>* & ptr_data) ...@@ -414,7 +414,14 @@ void mxArray2Ptr(const mxArray* mxMat, std::complex<FPP>* & ptr_data)
const mxClassID V_CLASS_ID = mxGetClassID(mxMat); const mxClassID V_CLASS_ID = mxGetClassID(mxMat);
const size_t NB_ELEMENTS = mxGetNumberOfElements(mxMat); size_t nb_element_tmp;
if (mxIsSparse(mxMat))
nb_element_tmp = mxGetNzmax(mxMat);
else
nb_element_tmp = mxGetNumberOfElements(mxMat);
const size_t NB_ELEMENTS = nb_element_tmp;
// get the real part of the Matlab Matrix // get the real part of the Matlab Matrix
FPP* ptr_real_part_data; FPP* ptr_real_part_data;
...@@ -458,8 +465,18 @@ void mxArray2CplxPtrPart(const mxArray* mxMat, FPP* & ptr_data) ...@@ -458,8 +465,18 @@ void mxArray2CplxPtrPart(const mxArray* mxMat, FPP* & ptr_data)
{ {
const mxClassID V_CLASS_ID = mxGetClassID(mxMat); const mxClassID V_CLASS_ID = mxGetClassID(mxMat);
size_t nb_element_tmp;
if (mxIsSparse(mxMat))
nb_element_tmp = mxGetNzmax(mxMat);
else
nb_element_tmp = mxGetNumberOfElements(mxMat);
const size_t NB_ELEMENTS = nb_element_tmp;
const size_t NB_ELEMENTS = mxGetNumberOfElements(mxMat);
if (!mxIsComplex(mxMat)) if (!mxIsComplex(mxMat))
mexErrMsgTxt("Can't get imaginary part of a real matrix"); mexErrMsgTxt("Can't get imaginary part of a real matrix");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment