[前言]
matlab和c++混合编程—方法和步骤,介绍了MATLAB和C++相互调用的方法
https://blog.csdn.net/yimiyangguang185/article/details/52626320
本文主要记录C++调用MATLAB DLL的方法
MATLAB编译为dll
matlab函数编译dll
https://blog.csdn.net/a15216111693/article/details/79232288
需要注意编译器的选择问题
C++与MATLAB参数输入输出传递:mwArray
mwArray :C++用它与MATLAB传递输i/o 参数。MATLAB中的参数都是矩阵表示,哪怕是1*1的矩阵。
mwArray类说明
mwArray类说明 https://blog.csdn.net/yujiao12365/article/details/79533121
mwArray的用法 https://blog.csdn.net/qq_26376985/article/details/50203021
矩阵赋值给mwArray
<1>mwArray 定义矩阵变量
mwArray A(rows, cols, type)
参数说明:
A : 变量名
rows:行数
col :列数
type :数t据类型
type类型有:
typedef enum
{
mxUNKNOWN_CLASS = 0, //未知类型
mxCELL_CLASS, //细胞类型
mxSTRUCT_CLASS, //结构类型
mxLOGICAL_CLASS, //布尔类型
mxCHAR_CLASS, //字符串类型
mxVOID_CLASS, //void类型
mxDOUBLE_CLASS,
mxSINGLE_CLASS, //单精度浮点数
mxINT8_CLASS, //
mxUINT8_CLASS,
mxINT16_CLASS,
mxUINT16_CLASS,
mxINT32_CLASS,
mxUINT32_CLASS,
mxINT64_CLASS,
mxUINT64_CLASS,
mxFUNCTION_CLASS, //函数类型
mxOPAQUE_CLASS, //
mxOBJECT_CLASS //对象类型
}
整体含义是:定义矩阵A,行数为:rows,列数为:cols,类型为:type
注: 如果参数不是矩阵,只是一个数,令 rows=1,cols=1即可。
<2>矩阵赋初值:
int a[6] = {1,2,3,4,5,6}
mwArray A(2,3,mxINT32_CLASS);
A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
注:该过程相当于把16的矩阵,转化为23的矩阵,matlab转化顺序是,先排第一列,由上到下为a[0] a[1],然后排第二列,由上到下为a[2] a[3],即转化后的A为:
1 3 5
2 4 6
如果要使A为:
1 2 3
4 5 6
需这样赋值:
int a[6] = {1,2,3,4,5,6}
mwArray A(3,2,mxINT32_CLASS); //修改此处:行列数互换
A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
此时生成的A为:
1 4
2 5
3 6
该矩阵转置之后,既可以达到所需形式,转置过程可以在matlab的.m文件中添加,先修改.m,然后在生成dll、lib、h文件。
尤其是,在图像处理时,如果传递的矩阵为图像数据矩阵,要采用后一种方法赋值,否则,图像会严重变形失真。
## 字符串赋值给mwArray
char str[5] = "abcd";
//或 CString str = "abcd"
mwArray mwA(str);
该过程比较简单。
## 复数数组与mwArray相互传递
转自:http://hi.baidu.com/the_sun_23/item/7b1f5e5073098bbf09be17a9
double rdata[4] = {1.0, 2.0, 3.0, 4.0};
double idata[4] = {10.0, 20.0, 30.0, 40.0};
mwArray a(2, 2, mxDOUBLE_CLASS, mxCOMPLEX);
a.Real().SetData(rdata, 4);
a.Imag().SetData(idata, 4);
对应从mwArray中获取元素
a.Real().GetData(buffer,len);
a.Imag().GetData(buffer,len);
## cell元组阵列的获取
由于mwArray索引运算符()直接返回mwArray类型,因此可以直接声明通过索引获取元组内的矩阵值。
eg: a={[1],[2],[1 2;3 4];[1 3;2 4],[1],[2]};
mwArray b=a(2); //b=[1 3;2 4];
mwArray c=a(5); //c=[1 2;3 4];
PS:mwArray中数组为按列排,因此[1 3;2 4]的索引号为2
## 结构体传入mwArray
转自:https://blog.csdn.net/yzl20092856/article/details/47271403
#include
#include "MyAddLib.h"
using namespace std;
int main()
{
if(!MyAddLibInitialize())
{
return -1;
}
int a = 1;
int b = 2;
int c = 0;
struct myStruct
{//定义一个结构体
bool flg;
int x;
};
myStruct mys;//声明一个结构体变量
mys.flg = true;//变量赋值
mys.x=10;
const int nfields = 2;//结构体内的变量个数
const char *fieldnames[2]={"flg","x"};//结构体内的变量名称
mwArray mwStruct(1,1,nfields,fieldnames);//声明一个wmArray类型变量
/*
mwArray(mwSize num_rows,mwSize num_cols,int num_fields,const char**fieldnames)
创建行数为num_rows,列数为num_cols结构体阵列,结构体域名为由fieldnames指定,域名个数由num_fields指定
*/
mwArray mflg(mys.flg);//
mwStruct(fieldnames[0],1,1)=mflg;//给结构体内的变量赋值
mwArray mx(mys.x);
mwStruct(fieldnames[1],1,1)=mx;//给结构体内的变量赋值
mwArray mwA(1,1,mxINT32_CLASS);//int型
mwArray mwB(1,1,mxINT32_CLASS);
mwArray mwC(1,1,mxINT32_CLASS);
mwA.SetData(&a,1);
mwB.SetData(&b,1);
MyAdd(1,mwC,mwA,mwB,mwStruct);
c = mwC.Get(1,1);
cout<