xArray.h // xArray.h: interface for the xArray class. // ////////////////////////////////////////////////////////////////////// /************************************************************************/ /* matlab&c++ author:san address:南京航空航天大学 CEPE 202 EMAIL:visualsan@yahoo.cn This file is part of matlab&c++ interface. feel easy to use it. san. 2010.3. */ /************************************************************************/ #if !defined(AFX_XARRAY_H__E9513DDD_B921_40A3_A86C_3F2A74D1F41A__INCLUDED_) #define AFX_XARRAY_H__E9513DDD_B921_40A3_A86C_3F2A74D1F41A__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "ImxArray.h" #include <vector> template<class T> class xArray; typedef xArray<bool> xArrayBool; typedef xArray<char> xArrayChar; typedef xArray<double> xArrayDouble; typedef xArray<float> xArrayFloat; typedef xArray<int> xArrayInt; typedef xArray<unsigned int> xArrayUInt; typedef xArray<__int64> xArrayInt64; typedef xArray<unsigned __int64> xArrayUInt64; template<class T> class xArray :public ImxArray { public: xArray(mwSize dims=1, mwSize* dim=NULL, T *valReal=0,T *valImg=0,mxComplexity flag=mxREAL); virtual ~xArray(); int GetDimSize(); int GetDim(int index ); int GetDataSize(); mxClassID GetClassID(); bool IsComplex(); void Reset(mwSize dims, mwSize* dim, T *valReal=0,T *valImg=0,mxComplexity flag=mxREAL ); void GetRealData(T*bufferReal,int buffersize); void SetRealData(T*bufferReal,int buffersize); void GetImgData( T*bufferImg, int buffersize); void SetImgData( T*bufferImg, int buffersize); virtual bool SetArray(mxArray* pArray,bool bCopy=0); private: void _Create(mwSize dims, mwSize* dim, T *valReal,T *valImg,mxComplexity flag); std::vector<mwSize> m_dims; mxClassID m_classID; mxComplexity m_mxComplexity; }; template<class T> xArray<T>::xArray(mwSize dims, mwSize* dim,T *valReal,T *valImg,mxComplexity flag) { m_dataType = MX_DATA_NUMRIC_ARRAY; m_mxComplexity=flag; for(int i=0;i<dims;i++) { if(dim) { m_dims.push_back(dim[i]); } else m_dims.push_back(1); } std::string str=typeid(T).name(); char *copy1=_strlwr( _strdup( str.data() ) ); str=copy1; if(str=="bool"){ m_classID = mxLOGICAL_CLASS;m_dataType=MX_DATA_ARRAY_BOOL;}else if(str=="char"){ m_classID = mxCHAR_CLASS; m_dataType=MX_DATA_ARRAY_STRING;}else if(str=="double"){ m_classID = mxDOUBLE_CLASS;m_dataType=MX_DATA_ARRAY_DOUBLE; }else if(str=="float"){ m_classID = mxSINGLE_CLASS; m_dataType=MX_DATA_ARRAY_FLOAT;}else if(str=="int"){ m_classID = mxINT32_CLASS; m_dataType=MX_DATA_ARRAY_INT;}else if(str=="unsigned int"){ m_classID = mxUINT32_CLASS; m_dataType=MX_DATA_ARRAY_UINT;}else if(str=="__int64"){ m_classID = mxINT64_CLASS;m_dataType=MX_DATA_ARRAY_INT64; }else if(str=="unsigned __int64"){ m_classID = mxUINT64_CLASS;m_dataType=MX_DATA_ARRAY_UINT64; }else if(str=="class xstruct"){ m_classID = mxSTRUCT_CLASS; m_dataType=MX_DATA_ARRAY_STRUCT;} _Create(dims,dim,valReal,valImg,flag); strcpy(m_szTypeName,str.data()); free(copy1); } template<class T> int xArray<T>::GetDimSize() { return m_dims.size(); } template<class T> int xArray<T>::GetDim(int index ) { ASSERT(index>0 && index<m_dims.size() ); return m_dims[index]; } template<class T> int xArray<T>::GetDataSize() { int s=1; for (int i=0;i<m_dims.size();i++) { s*=m_dims[i]; } return s; } template<class T> bool xArray<T>::IsComplex() { return m_mxComplexity==mxCOMPLEX; } template<class T> xArray<T>::~xArray() { } template<class T> void xArray<T>::GetRealData(T*bufferReal,int buffersize) { if(buffersize<GetDataSize()) return; memcpy((void *)bufferReal, (void *)mxGetData(m_pArray), sizeof(T)*GetDataSize()); } template<class T> void xArray<T>::SetRealData(T*bufferReal,int buffersize) { if( buffersize<GetDataSize() || bufferReal==NULL ) return; memcpy((void *)mxGetData(m_pArray), (void *)bufferReal, sizeof(T)*GetDataSize()); } template<class T> void xArray<T>::GetImgData(T*bufferImg,int buffersize) { if( !IsComplex() ) { memset((void *)bufferImg,'0', sizeof(T)*buffersize); return ; } if(buffersize<GetDataSize()) return; memcpy((void *)bufferImg, (void *)mxGetPi(m_pArray),sizeof(T)*GetDataSize()); } template<class T> void xArray<T>::SetImgData(T*bufferImg,int buffersize) { if( !IsComplex() ) { return ; } if( buffersize<GetDataSize()|| bufferImg==NULL ) return; memcpy((void *)mxGetPi(m_pArray), (void *)bufferImg, sizeof(T)*GetDataSize()); } template<class T> void xArray<T>::Reset(mwSize dims, mwSize* dim, T *valReal,T *valImg,mxComplexity flag ) { mxDestroyArray(m_pArray); _Create(dims,dim,valReal,valImg,flag); } template<class T> void xArray<T>::_Create(mwSize dims, mwSize *dim, T *valReal,T *valImg,mxComplexity flag) { mwSize *val=0; if(dim==0) { val = new mwSize[dims]; for (int i=0;i<dims;i++) { val[i] = 1; } } if(val) { m_pArray = mxCreateNumericArray(dims,val,m_classID,flag); if(val) delete [] val; } else m_pArray = mxCreateNumericArray(dims,dim,m_classID,flag); if(valReal) SetRealData(valReal,GetDataSize()); if(valImg&&IsComplex()) SetImgData(valImg,GetDataSize()); } template<class T> bool xArray<T>::SetArray(mxArray* pArray,bool bCopy) { if ( mxGetClassID(pArray) == m_classID ) { if(bCopy) pArray=mxDuplicateArray(pArray); mxDestroyArray(m_pArray); m_pArray=pArray; m_mxComplexity = mxIsComplex(pArray)?mxCOMPLEX:mxREAL; int n=mxGetNumberOfDimensions(pArray); const mwSize*dims=mxGetDimensions(pArray); m_dims.clear(); for (int i=0;i<n;i++) { m_dims.push_back( dims[i] ); } return 1; } return 0; } #endif // !defined(AFX_XARRAY_H__E9513DDD_B921_40A3_A86C_3F2A74D1F41A__INCLUDED_) NO xArray.CPP xMatrix.h // xMatrix.h: interface for the xDoubleMatrix class. // ////////////////////////////////////////////////////////////////////// /************************************************************************/ /* matlab&c++ author:san address:南京航空航天大学 CEPE 202 EMAIL:visualsan@yahoo.cn This file is part of matlab&c++ interface. feel easy to use it. san. 2010.3. */ /************************************************************************/ #if !defined(AFX_XDOUBLEMATRIX_H__8BCBA4DC_BA59_4E1B_96B9_D0E9EC9CD7C5__INCLUDED_) #define AFX_XDOUBLEMATRIX_H__8BCBA4DC_BA59_4E1B_96B9_D0E9EC9CD7C5__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "ImxArray.h" #include <vector> #include <assert.h> template<class T> class xMatrix; typedef xMatrix<bool> xMatrixBool; typedef xMatrix<char> xMatrixChar; typedef xMatrix<double> xMatrixDouble; typedef xMatrix<float> xMatrixFloat; typedef xMatrix<int> xMatrixInt; typedef xMatrix<unsigned int> xMatrixUInt; typedef xMatrix<__int64> xMatrixInt64; typedef xMatrix<unsigned __int64> xMatrixUInt64; template<class T> class xMatrix :public ImxArray { public: xMatrix(mwSize m=1, mwSize n=1, T *valReal=0,T *valImg=0,mxComplexity flag=mxREAL); virtual ~xMatrix(); int GetR(); int GetC(); mxClassID GetClassID(); bool IsComplex(); void Reset(mwSize r, mwSize c, T *valReal=0,T *valImg=0,mxComplexity flag=mxREAL ); T GetRealAt(int r=0,int c=0);//0 base T GetImgAt(int r=0,int c=0);//0 base bool SetRealAt(int r=0,int c=0,T val=0);//0 base bool SetImgAt(int r=0,int c=0,T val=0);//0 base //MATLAB按列存储 void GetRealData(T*bufferReal,int buffersize); void SetRealData(T*bufferReal,int r,int c); void GetImgData( T*bufferImg, int buffersize); void SetImgData( T*bufferImg, int m,int n); virtual bool SetArray(mxArray* pArray,bool bCopy=0); //MAT2C将C语言类型矩阵转换为MATLAB形式 static void C2Mat(T* c_input,int r,int c,T*m_outPut); private: void _Create(mwSize r, mwSize c, T *valReal,T *valImg,mxComplexity flag); int m_r,m_c; mxClassID m_classID; mxComplexity m_mxComplexity; }; template<class T> xMatrix<T>::xMatrix(mwSize r, mwSize c,T *valReal,T *valImg,mxComplexity flag) { m_dataType = MX_DATA_NUMRIC_MATRIX; m_r=r; m_c=c; m_mxComplexity=flag; std::string str=typeid(T).name(); char *copy1=_strlwr( _strdup( str.data() ) ); str=copy1; if(str=="bool"){ m_classID = mxLOGICAL_CLASS;m_dataType=MX_DATA_MATRIX_BOOL;}else if(str=="char"){ m_classID = mxCHAR_CLASS; m_dataType=MX_DATA_MATRIX_STRING;}else if(str=="double"){ m_classID = mxDOUBLE_CLASS;m_dataType=MX_DATA_MATRIX_DOUBLE; }else if(str=="float"){ m_classID = mxSINGLE_CLASS; m_dataType=MX_DATA_MATRIX_FLOAT;}else if(str=="int"){ m_classID = mxINT32_CLASS; m_dataType=MX_DATA_MATRIX_INT;}else if(str=="unsigned int"){ m_classID = mxUINT32_CLASS; m_dataType=MX_DATA_MATRIX_UINT;}else if(str=="__int64"){ m_classID = mxINT64_CLASS;m_dataType=MX_DATA_MATRIX_INT64; }else if(str=="unsigned __int64"){ m_classID = mxUINT64_CLASS;m_dataType=MX_DATA_MATRIX_UINT64; }else if(str=="class xstruct"){ m_classID = mxSTRUCT_CLASS; m_dataType=MX_DATA_MATRIX_STRUCT;} strcpy(m_szTypeName,str.data()); _Create(r,c,valReal,valImg,flag); free(copy1); // printf("%s %s/n",str,mxGetClassName(m_pArray)); } template<class T> xMatrix<T>::~xMatrix() { } template<class T> void xMatrix<T>::GetRealData(T*bufferReal,int buffersize) { if(buffersize<m_r*m_c) return; memcpy((void *)bufferReal, (void *)mxGetPr(m_pArray), sizeof(T)*m_r*m_c); } template<class T> void xMatrix<T>::SetRealData(T*bufferReal,int r,int c) { if( r!=m_r || c!=m_c || bufferReal==NULL ) return; // printf("SetRealData/n"); memcpy((void *)mxGetPr(m_pArray), (void *)bufferReal, sizeof(T)*m_r*m_c); } template<class T> void xMatrix<T>::GetImgData(T*bufferImg,int buffersize) { if( !IsComplex() ) { memset((void *)bufferImg,'0', sizeof(T)*m_r*m_c); return ; } if(buffersize<m_r*m_c) return; memcpy((void *)bufferImg, (void *)mxGetPi(m_pArray),sizeof(T)*m_r*m_c); } template<class T> void xMatrix<T>::SetImgData(T*bufferImg,int r,int c) { if( !IsComplex() ) { return ; } if( r!=m_r || c!=m_c || bufferImg==NULL ) return; // printf("m!=m_m || n!=m_n || bufferImg==NULL =%d/n",m!=m_m || n!=m_n || bufferImg==NULL ); memcpy((void *)mxGetPi(m_pArray), (void *)bufferImg, sizeof(T)*m_r*m_c); } template<class T> void xMatrix<T>::Reset(mwSize r, mwSize c, T *valReal,T *valImg,mxComplexity flag ) { mxDestroyArray(m_pArray); _Create(r,c,valReal,valImg,flag); } template<class T> void xMatrix<T>::_Create(mwSize r, mwSize c, T *valReal,T *valImg,mxComplexity flag) { // printf("mxComplexity=%d/n",flag==mxCOMPLEX?1:0); m_pArray = mxCreateNumericMatrix(r,c,m_classID,flag); if(valReal) SetRealData(valReal,r,c); if(valImg&&IsComplex()) SetImgData(valImg,r,c); // printf("valImg&&IsComplex()=%d/n",valImg&&IsComplex()); } template<class T> bool xMatrix<T>::SetArray(mxArray* pArray,bool bCopy) { if ( mxGetClassID(pArray) == m_classID ) { if(bCopy) pArray=mxDuplicateArray(pArray); int n=mxGetNumberOfDimensions(pArray); if(n==2) { mxDestroyArray(m_pArray); m_pArray=pArray; m_r=mxGetM(pArray); m_c=mxGetN(pArray); m_mxComplexity = mxIsComplex(pArray)?mxCOMPLEX:mxREAL; return 1; } } return 0; } template<class T> int xMatrix<T>::GetR() { return m_r; } template<class T> int xMatrix<T>::GetC() { return m_c; } template<class T> mxClassID xMatrix<T>::GetClassID() { return m_classID; } template<class T> bool xMatrix<T>::IsComplex() { return m_mxComplexity==mxCOMPLEX; } template<class T> T xMatrix<T>::GetRealAt(int r,int c)//0 base { assert(r>=0&&r<m_r&&c>=0&&c<m_c); T*P=(T*)mxGetData(m_pArray); return P[r+m_r*c]; } template<class T> T xMatrix<T>::GetImgAt(int r,int c)//0 base { assert(r>=0&&r<m_r&&c>=0&&c<m_c); T*P=(T*)mxGetPi(m_pArray); if(P==NULL) return T(); return P[r+m_r*c]; } template<class T> bool xMatrix<T>::SetRealAt(int r,int c,T val)//0 base { assert(r>=0&&r<m_r&&c>=0&&c<m_c); T*P=(T*)mxGetData(m_pArray); P[r+m_r*c]=val; return 1; } template<class T> bool xMatrix<T>::SetImgAt(int r,int c,T val)//0 base { assert(r>=0&&r<m_r&&c>=0&&c<m_c); T*P=(T*)mxGetPi(m_pArray); if(P) P[r+m_r*c]=val; return P!=NULL; } template<class T> void xMatrix<T>::C2Mat(T* input,int r,int c,T*outPut) { T *tmp=new T[r*c]; for (int i=0;i<c;i++) { for (int j=0;j<r;j++) { tmp[ (i*r+j)%c*r + (i*r+j)/c ] = input[i*r+j]; } } if (outPut) { memcpy(outPut, tmp, sizeof(T)*r*c); } delete [] tmp; } #endif // !defined(AFX_XDOUBLEMATRIX_H__8BCBA4DC_BA59_4E1B_96B9_D0E9EC9CD7C5__INCLUDED_) NO xMatrix.CPP