目录
前言mwArrayBrief构造函数成员方法C++ 调用 MATLAB 实例前期准备无返回值有返回值注意事项
前言
之前我写过一篇 MATLAB与C语言的混合编程,那个是用 mex 命令 来编译 .C 文件 生成 .mexw64 文件来给 MATLAB 调用。注意啊,是在 MATLAB中 调用 C函数。
现在,在这偏推送里讲的是:在 C++中 调用 MATLAB函数 !
其实,我之前也没怎么学在C++中调用MATLAB,突然学这个是因为 上上周老师催着要一个原型发给客户。但是核心的算法目前仅仅是用MATLAB验证了正确性,还没有用C++写。如果核心的算法用 C++ 来写的话估计要花好久(毕竟也就学了一个学期多点的C++)。所以为了赶时间,我就打算用 MATLAB 把核心的算法打包成动态,然后拿去给C++调用。
简单展示下还没做完的东西吧:
不多说废话了,进入正题。
mwArray
关于 mwArray 的构造函数 以及 其成员方法 部分,完全是按照官网上的 文档复制过来的,有一些关于稀疏矩阵的方法我这里没放,我平时也没解过大型的方程组,所以稀疏矩阵这块也没怎么用,也就没有花时间去了解它。
Brief
Class used to pass input/output arguments to C++ functions generated by MATLAB Compiler SDK
用于将输入/输出参数传递给由MATLAB Compiler SDK生成的C ++函数的类。
使用mwArray类将输入/输出参数传递给由MATLAB生成的 C++ 接口函数。在MATLAB中所有的数据均由数组表示,这个类就是是对MATLAB中数组的封装。mwArray类提供必一些构造函数,方法以及运算符,用于数组的创建和初始化 以及 简单索引方式取值。
构造函数
1. 创建 空的 数组
/// 空的 数组,元素类型预定为 double; 构造函数:mwArray(mxClassID mxID)
mwArray a(mxDOUBLE_CLASS);
/// Note:mxClassID有以下若干种(下同)
mxDOUBLE_CLASS
mxSINGLE_CLASS
mxINT8_CLASS
mxUINT8_CLASS
mxINT16_CLASS
mxUINT16_CLASS
mxINT32_CLASS
mxUINT32_CLASS
mxINT64_CLASS
mxUINT64_CLASS
2. 二维数组
/// 二维数组 构造函数:mwArray(mwSize num_rows, mwSize num_cols, mxClassID mxID, mxComplexity cmplx = mxREAL)
// 行 和 列 都是 mwSize 类型的值,mwSize 是 size_t 的 typedef,
// size_t 在win64种是 unsigned __int64 的typedef;在其他中是 unsigned int 的typedef
mwSize num_rows = 3;
mwSize num_cols = 3;
mwArray b(num_rows, num_cols, mxDOUBLE_CLASS);
3. 三维数组/多维数组
/// 三维数组 mwArray(mwSize num_dims, const mwSize* dims, mxClassID mxID, mxComplexity cmplx = mxREAL)
mwSize num_dims = 3; // 数组的维数
const mwSize dims[3] = {
5, 5, 3}; // 每个维度具体的值
mwArray c(num_dims, dims, mxDOUBLE_CLASS);
其实 二维数组 也可以用这样的方式来创建
4. 一维字符数组(字符串)
/// 一维字符数组 mwArray(const char* str)
std::string str = "Mitch Hong";
mwArray d(str.c_str());
5. 多行字符串
/// 多行字符串,不要求每行字符个数相等 mwArray(mwSize num_strings,const char ** str)
const mwSize num_strings = 3;
const char* strs[num_strings] = {
"Mitch", "Hong", "Miao"};
mwArray e(num_strings, strs);
6. 结构体数组
/// 二维 结构体数组 mwArray(mwSize num_rows, mwSize num_cols, int num_fields, const char** fieldnames)
// Note: 结构体的每个 域值 也 必须是 mwArray 类型。在后面 方法30 中写了一个 设置结构体域值的例子
num_rows = 2; // 前面声明且定义过,这里直接赋值
num_cols = 2; // 前面声明且定义过,这里直接赋值
int num_fields = 2;
const char* fields[2] = {
"Name", "Sex"};
mwArray f(num_rows, num_cols, num_fields, fields);
这个可能稍微难理解一点,多看几眼这个构造函数,这个构造函数就是说明结构体数组有 几行 几列,几个域名,每个域名具体是什么。对于结构体值的设置,看一下下面的第30个成员方法。
7. 多维结构体数组
略,我都没碰见过,就不写这个了。
8. 拷贝构造函数(深拷贝)
mwArray(const mwArray& arr)
9. 标量
/// 标量 实数:mwArray( re);虚数:mwArray( re, im)
mwArray g(mxDouble);
mwArray h(mxDouble, mxDouble);
成员方法
基本复制的官网上的,基本都没改。
1. 深拷贝 mwArray Clone() const
mwArray a(2, 2, mxDOUBLE_CLASS);
mwArray b = a.Clone();