跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表

目录

  1. 1. 为什么用 mwArray 而不是 mxArray?
  2. 2. 常用构造函数
  3. 3. 索引与取值
  4. 4. 数据读写(连续内存块)
  5. 5. 常用查询方法
  6. 6. 高级数据类型处理
  7. 7. 现代建议与编译注意
MATLAB / Octave算法

MATLAB Compiler SDK 中的 mwArray 核心类使用详解

MATLAB Compiler SDK 生成的 C++ 共享库中 mwArray 类的用法。作为 mxArray 的 C++ 封装,mwArray 提供自动内存管理、运算符重载及 RAII 风格操作。内容涵盖构造函数、1-based 索引、数据读写、常用查询方法及复数、Cell 数组处理。同时对比了 mxArray 写法,并给出了编译注意事项及向 MATLAB Data API 迁移的建议。

灵魂摆渡发布于 2026/3/27更新于 2026/4/174 浏览

mwArray 是 MATLAB Compiler SDK(以前叫 MATLAB Compiler)生成的 C++ shared library(或 standalone application)中,用来在 C++ 和 MATLAB 之间传递输入/输出参数的核心类。它本质上是 mxArray 的 C++ 封装(wrapper),让 C++ 程序员可以用更自然的面向对象方式操作 MATLAB 矩阵/数组,而不用手动管理 mxArray 指针和 mxDestroyArray 等繁琐的 C 风格内存操作。

1. 为什么用 mwArray 而不是 mxArray?

对比两种写法:

mxArray 写法(C 风格):

mxArray *a = NULL, *b = NULL, *c = NULL;
mlfEnterNewContext(0, 0);
mlfAssign(&a, mlfScalar(1.0));
mlfAssign(&b, mlfScalar(2.0));
mlfAssign(&c, mlfPlus(a, b));
// 调用生成的 mlfXXX 函数
mlfReleasePreviousContext(0, 0);
mxDestroyArray(a);
mxDestroyArray(b);
mxDestroyArray(c);

mwArray 写法(推荐):

mwArray a(1.0), b(2.0), c;
c = a + b; // 直接运算符重载
// 离开作用域自动析构,无需手动 destroy

mwArray 的优势:

  • 自动内存管理(引用计数 + copy-on-write)
  • 支持运算符重载(+、-、*、/、() 索引等)
  • 更安全的 RAII 风格
2. 常用构造函数
// 空数组 / 指定尺寸 + 类型
mwArray a; // empty
mwArray b(, , mxDOUBLE_CLASS); 
; 


; 
; 
; 


 vals[] = {, , , , , };
;
g.(vals, ); 


 * fields[] = {, , };
; 


mwArray t = g;
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • WebGL 缓冲区使用与多点绘制实战
  • Webots 机器人模拟器:新手快速入门指南
  • ModelSim 仿真软件介绍与安装使用指南
  • Python 体育数据爬虫:基于 Playwright 与异步技术的高性能采集
  • 数据结构——图:遍历、最小生成树与最短路径
  • 面板数据模型原理与Python实现
  • 基于 NEAT 算法的 Flappy Bird AI 自动通关实现
  • 智能小车快速循迹串级 PID 算法实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

5
3
// 5×3 double 实数矩阵
mwArray c(4, 4, mxDOUBLE_CLASS, mxCOMPLEX)
// 复数矩阵
// 标量(最常用!)
mwArray d(3.14)
// 1×1 double
mwArray e(true)
// 1×1 logical
mwArray f("hello")
// 1×N char
// 从已有数据填充(列优先!)
double
6
1
2
3
4
5
6
mwArray g(2, 3, mxDOUBLE_CLASS)
SetData
6
// 填充后变成 [1 3 5; 2 4 6]
// 结构体
const
char
"name"
"age"
"score"
mwArray s(1, 1, 3, fields)
// 1×1 struct
// 拷贝构造(浅拷贝,copy-on-write)
3. 索引与取值

mwArray 的索引是 1-based(和 MATLAB 一样),而不是 C/C++ 的 0-based。

mwArray A(3, 4, mxDOUBLE_CLASS);
// ... 填充数据

double val;
// 单个元素(最常用两种写法)
val = A(2, 3); // 第 2 行第 3 列 → A.Get(2, 3)
val = A.Get(1, 2, 3); // 同上,但显式调用

// 多维索引(支持任意维)
mwArray B(2, 3, 4, mxDOUBLE_CLASS);
double v = B(1, 2, 3); // 第 1 页、第 2 行、第 3 列

// 线性索引(少用)
double lin = A.Get(1, 7); // 第 7 个元素(列优先)

// 取整块子数组(返回新的 mwArray)
mwArray sub = A.Get(2, ":, 2:3"); // 不支持字符串下标,需用索引数组

注意:不支持 MATLAB 的 'end' 或逻辑索引,只能用数值索引或创建 mwArray 索引数组。

4. 数据读写(连续内存块)
// 写入
double input[9] = {11, 12, 13, 21, 22, 23, 31, 32, 33};
mwArray mat(3, 3, mxDOUBLE_CLASS);
mat.SetData(input, 9);

// 读出
double output[9];
mat.GetData(output, 9);

// 复数
double re[4] = {1, 2, 3, 4}, im[4] = {5, 6, 7, 8};
mwArray z(2, 2, mxDOUBLE_CLASS, mxCOMPLEX);
z.SetData(re, im, 4); // 或分开 SetRealData / SetImagData
5. 常用查询方法
mat.ClassID()           // → mxDOUBLE_CLASS 等
mat.NumberOfElements()  // → 总元素个数
mat.NumberOfDimensions()
mat.GetDimensions()     // → 返回 mwArray 包含尺寸向量
mat.IsEmpty()
mat.IsComplex()
mat.IsSparse()
mat.Real() / mat.Imag() // → 返回实部/虚部
6. 高级数据类型处理

6.1 复数数组的初始化与数据读写

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); // 填充虚部
  • a.Real() 和 a.Imag() 各自返回一个 新的 mwArray(视图),但它们共享底层数据结构。
  • 存储顺序:列优先(MATLAB 内存布局)。

读取数据(推荐先检查尺寸):

if (a.IsComplex() && a.NumberOfElements() == 4) {
    double real_buf[4], imag_buf[4];
    a.Real().GetData(real_buf, 4);
    a.Imag().GetData(imag_buf, 4);
}

6.2 Cell 数组的索引与获取

// 假设 MATLAB 中 a 是 2×3 cell 数组
mwArray cell_array = ...; // 从函数返回或构造得到

mwArray b = cell_array(2, 1); // 等价 MATLAB a{2,1} → [1 3;2 4] 的矩阵
mwArray c = cell_array(1, 3); // 等价 a{1,3} → [1 2;3 4]

// 或者线性索引(列优先)
mwArray d = cell_array(5); // 第 5 个元素(列优先展开)→ [1 2;3 4]

关键区别:

  • cell_array(i, j) → 等价于 MATLAB 的 内容索引 a{i,j},返回 被包装的那个 MATLAB 对象(通常是另一个 mwArray)
  • 没有像 MATLAB 那样区分 {} 和 () —— mwArray 的 () 运算符在 cell 上直接做内容提取。

遍历 cell 数组示例:

mwArray cells(3, 2, mxCELL_CLASS); // 假设已填充
mwSize total = cells.NumberOfElements();
for (mwSize k = 1; k <= total; ++k) {
    mwArray elem = cells(k); // 线性索引取内容
    if (elem.ClassID() == mxDOUBLE_CLASS) {
        // 处理数值矩阵
    }
}

6.3 字符串 → mwArray

const char* filename = "input_data.mat";
mwArray mw_filename(filename); // 自动转为 1×N char 数组

// 或者多字符串(cellstr)
const char* files[] = {"a.mat", "b.mat", "c.mat"};
mwArray mw_files(3, 1, mxCELL_CLASS);
for (int i = 0; i < 3; ++i) {
    mw_files(i + 1) = mwArray(files[i]);
}

// 最简单:直接构造 char array
mwArray str("simulation completed");

传递给 MATLAB 函数时,直接把 mwArray 作为参数即可,编译器会自动处理 marshaling。

7. 现代建议与编译注意
  • MathWorks 官方已推荐迁移到 MATLAB Data API(C++11 风格,matlab::data::Array),mwArray 是老的 C++03 接口(compiler_sdk 仍支持,但逐渐边缘化)。
    • MATLAB Data API 更现代、支持 move 语义、异常安全更好。
    • 如果是新项目,优先考虑 'MATLAB Data' 接口(compiler.build 时指定 'Interface','matlab-data')。
  • 但:很多老项目、第三方代码仍然大量使用 mwArray,兼容性仍很好,短期内不会消失。
  • 编译注意:
    • 必须链接 libmclmcrrt.lib / mclmcrrt.dll
    • 调用前必须 mclInitializeApplication(NULL, 0);
    • 每个线程通常需要 mclInitializeThread()(视情况)

如果你正在写调用 MATLAB 生成的 C++ shared library 的代码,强烈建议先用 mwArray 快速原型,熟悉后再考虑是否切换到更新的 MATLAB Data API。

  • Python 基础入门:环境配置与开发工具安装
  • C++26 契约编程:三种实现方式与最佳实践
  • 21. 合并两个有序链表
  • C++ STL vector 容器源码实现详解
  • OpenPilot 开源自动驾驶系统移植与 L2 辅助驾驶开发指南
  • 数据结构:顺序表详解
  • 原生 JavaScript 打造动态滑动拼图验证码
  • Python 四大内置函数详解:filter、float、format、frozenset
  • Java Map 与 Set 数据结构及实现原理
  • 人工智能、机器学习与深度学习的真正区别
  • Python 调用手机摄像头
  • 2025 年 3 月 GESP 真题解析:C++ 八级选择题与判断题