C++调用matlab.
1.执行mcc -W lib:liba -T link:lib oula 生成liba.dll及头文件2.编译以下c代码,该代码写了一个mxMatDbl类
// callMatlab.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <matrix.h>
#include "../liba.h"
class mxMatDbl
{
public:
mxArray *m_array;
mxMatDbl()
{
m_array=0;
}
mxMatDbl(int h,int w,const double * pData)
{
m_array=mxCreateDoubleMatrix(h,w, mxREAL);
if(pData)
memcpy(mxGetPr(m_array),pData,h*w*sizeof(double));
}
double * getPtr()
{
return mxGetPr(m_array);
}
operator double *()
{
return mxGetPr(m_array);
}
operator mxArray *()
{
return m_array;
}
double & operator ()(int y,int x)
{
assert(m_array);
int W=w();
int H=h();
assert(y>=0 && y<H && x>=0 && x<W);
return *(mxGetPr(m_array)+ y*W + x);
}
int h()
{
return mxGetM(m_array);
}
int w()
{
return mxGetN(m_array);
}
void Release()
{
if(m_array)
{
mxDestroyArray(m_array);
m_array=0;
}
}
~mxMatDbl()
{
Release();
}
void Print()
{
for (int y=0;y<h();y++)
{
for (int x=0;x<w();x++)
{
printf("%g ",(*this)(y,x));
}
printf("\n");
}
}
protected:
private:
};
void TestMxMatDbl()
{
double data[6]={1.0 ,2.0 ,3.0 ,4.0,5.0,6.0};
mxMatDbl m(2,3,data);
printf("w %d,h %d\n",m.w(),m.h());
for (int y=0;y<m.h();y++)
{
for (int x=0;x<m.w();x++)
{
printf("%g ",m(y,x));
}
printf("\n");
}
}
void callMatlab()
{
libaInitialize();
double _r[]={0,0,0};
mxMatDbl r(3,1,_r);
mxMatDbl R(3,3,0);
if(0)
{//这一局怎么不行??
mxArray *prhs[1];prhs[0]=r.m_array;
mxArray *plhs[1];plhs[0]=R.m_array;
mlxOula(1, plhs, 1, prhs);
}
else
mlxOula(1, &R.m_array, 1, &r.m_array);
r.Print();
R.Print();
libaTerminate();
}
int main(int argc, char* argv[])
{
//TestMxMatDbl();
callMatlab();
return 0;
}
//
#include "stdafx.h"
#include <windows.h>
#include <matrix.h>
#include "../liba.h"
class mxMatDbl
{
public:
mxArray *m_array;
mxMatDbl()
{
m_array=0;
}
mxMatDbl(int h,int w,const double * pData)
{
m_array=mxCreateDoubleMatrix(h,w, mxREAL);
if(pData)
memcpy(mxGetPr(m_array),pData,h*w*sizeof(double));
}
double * getPtr()
{
return mxGetPr(m_array);
}
operator double *()
{
return mxGetPr(m_array);
}
operator mxArray *()
{
return m_array;
}
double & operator ()(int y,int x)
{
assert(m_array);
int W=w();
int H=h();
assert(y>=0 && y<H && x>=0 && x<W);
return *(mxGetPr(m_array)+ y*W + x);
}
int h()
{
return mxGetM(m_array);
}
int w()
{
return mxGetN(m_array);
}
void Release()
{
if(m_array)
{
mxDestroyArray(m_array);
m_array=0;
}
}
~mxMatDbl()
{
Release();
}
void Print()
{
for (int y=0;y<h();y++)
{
for (int x=0;x<w();x++)
{
printf("%g ",(*this)(y,x));
}
printf("\n");
}
}
protected:
private:
};
void TestMxMatDbl()
{
double data[6]={1.0 ,2.0 ,3.0 ,4.0,5.0,6.0};
mxMatDbl m(2,3,data);
printf("w %d,h %d\n",m.w(),m.h());
for (int y=0;y<m.h();y++)
{
for (int x=0;x<m.w();x++)
{
printf("%g ",m(y,x));
}
printf("\n");
}
}
void callMatlab()
{
libaInitialize();
double _r[]={0,0,0};
mxMatDbl r(3,1,_r);
mxMatDbl R(3,3,0);
if(0)
{//这一局怎么不行??
mxArray *prhs[1];prhs[0]=r.m_array;
mxArray *plhs[1];plhs[0]=R.m_array;
mlxOula(1, plhs, 1, prhs);
}
else
mlxOula(1, &R.m_array, 1, &r.m_array);
r.Print();
R.Print();
libaTerminate();
}
int main(int argc, char* argv[])
{
//TestMxMatDbl();
callMatlab();
return 0;
}
- 上一篇 三维地形图重建代码.
- 下一篇 Motoman机器人正向运动学.