在 C/C++ 客户端中管理 MATLAB 数据
MATLAB 数组
MATLAB® Runtime 使用单一对象类型:MATLAB 数组。所有 MATLAB 变量(包括标量、向量、矩阵、字符数组、元胞数组、结构体和对象)都存储为 MATLAB 数组。在 MATLAB Production Server™ C/C++ 客户端 API 中,MATLAB 数组被声明为 mpsArray
类型。mpsArray
结构体包含有关数组的以下信息:
类型
维度
与数组关联的数据
如果是数值,则变量是实数还是复数
如果稀疏,其索引和非零最大元素
如果是结构体或对象,则字段数和字段名称
要访问 mpsArray
结构体,请使用 mpsArray
API 函数。这些函数使您能够创建、读取和查询有关客户端使用的 MATLAB 数据的信息。
注意
mpsArray
API 镜像 MATLAB Compiler SDK™ 和 MATLAB 外部接口使用的 mxArray
API。
数据存储
MATLAB 以列主(按列)编号方案存储数据。MATLAB 在内部首先存储第一列的数据元素,然后存储第二列的数据元素,依此类推,直到最后一列。
例如,给定矩阵:
a=['house'; 'floor'; 'porch'] a = house floor porch
其尺维度为:
size(a) ans = 3 5
其数据存储为:
如果矩阵是 N 维的,则 MATLAB 表示 N 主序的数据。考虑一个三维大写字母数组,其尺寸为 4×2×3。您可以在三页 4×2 矩阵中可视化数据,如下图所示:
MATLAB 内部按以下顺序表示此三维数组的数据:
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
mpsCalcSingleSubscript()
函数使用 N 维下标创建从数组的第一个元素到所需元素的偏移量。
注意
MATLAB 索引从 1 开始,而 C 索引从 0 开始。
MATLAB 类型
复数双精度矩阵
复数双精度非稀疏矩阵为 double 类型,维数为 m×n,其中 m
是行数,n
是列数。数据存储为两个双精度数字向量 - 一个包含实部数据,一个包含虚部数据。指向该数据的指针分别称为 pr
(指向实数数据的指针)和 pi
(指向虚数数据的指针)。非复数矩阵是 pi
为 NULL
的矩阵。
数值矩阵
数值矩阵是单精度浮点整数,可以是 8 位、16 位、32 位和 64 位,有符号和无符号。数据以与双精度矩阵相同的方式存储在两个向量中。
逻辑矩阵
logical
数据类型分别使用数字 true
和 false
表示逻辑 1
或 0
状态。某些 MATLAB 函数和运算符返回逻辑 1
或逻辑 0
来指示某个条件是否为真。例如,语句 (5 * 10) > 40
返回逻辑 1
值。
MATLAB 字符数组
MATLAB 字符数组属于 char
类型,其存储方式与无符号 16 位整数类似,但没有虚部数据组件。与 C 不同,MATLAB 字符数组不以空值终止。
元胞数组
元胞数组是 MATLAB 数组的集合,其中每个 mpsArray
称为一个元胞,从而可以将不同类型的 MATLAB 数组存储在一起。元胞数组的存储方式与数值矩阵类似,只是数据部分包含指向 mpsArray
的单个指针向量。此向量的成员称为元胞。每个元胞可以是任何受支持的数据类型,甚至是另一个元胞数组。
结构体
结构是 MATLAB 数组,其元素由文本字段指示符访问。
以下是在 MATLAB 中如何创建结构体的示例:
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'
创建一个具有三个字段的标量结构体:
S = name: 'Ed Plum' score: 83 grade: 'B+'
1×1 结构体的存储方式与 1×n
元胞数组相同,其中 n
是结构体中的字段数。数据向量的成员称为字段。每个字段都与存储在 mpsArray
中的名称相关联。
多维数组
多维数组是一个整数向量,其中每个元素都是相应维度的大小。数据的存储与矩阵相同。任何类型的 MATLAB 数组都可以是多维的。
空数组
任何类型的 MATLAB 数组都可以为空。空的 mpsArray
至少有一个维度等于零。例如,类型为 mpsArray
的双精度 double
,其中 m
和 n
等于 0
,而 pr
为 NULL
,是一个空数组。
稀疏矩阵
稀疏矩阵与 MATLAB 中的满矩阵具有不同的存储约定。参数 pr
和 pi
仍然是双精度数字数组,但这些数组只包含非零数据元素。还有三个附加参数:
nzmax
是一个整数,包含ir
、pr
以及(如果存在)pi
的长度。它是稀疏矩阵中非零元素的最大数量。ir
指向长度为nzmax
的整数数组,其中包含pr
和pi
中对应元素的行索引。jc
指向长度为n+1
的整数数组,其中 n 是稀疏矩阵中的列数。jc
数组包含列索引信息。如果稀疏矩阵的第j
列有任何非零元素,则jc[j]
是第ir
列中第一个非零元素在pr
和pi
(以及j
,如果存在)中的索引,而jc[j+1] - 1
是该列中最后一个非零元素的索引。对于稀疏矩阵的第j
列,jc[j]
是所有前列中非零元素的总数。jc
数组的最后一个元素jc[n]
等于nnz
,即整个稀疏矩阵中非零元素的数量。如果nnz
小于nzmax
,则可以将更多非零条目插入数组中,而无需分配更多存储空间。
使用数据类型
您可以用 C/C++ 编写 MATLAB Production Server 客户端应用程序,接受 MATLAB 支持的任何类或数据类型(请参阅 MATLAB 类型)。
小心
MATLAB Runtime 不会检查用 C/C++ 创建的 MATLAB 数据结构体的有效性。使用无效语法创建 MATLAB 数据结构体可能会导致意外行为。
声明数据结构
要处理 MATLAB 数组,请使用类型 mpsArray
。以下语句声明一个名为 mpsArray
的 myData
:
mpsArray *myData;
要定义 myData
的值,请使用 mpsCreate*
函数之一。一些有用的数组创建例程是 mpsCreateNumericArray()
、mpsCreateCellArray()
和 mpsCreateCharArray()
。例如,以下语句分配一个 m
×1 浮点 mpsArray
并初始化为 0
:
myData = mpsCreateDoubleMatrix(m, 1, mpsREAL);
C/C++ 程序员应该注意 MATLAB 数组中的数据是按列主序排列的。(有关插图,请参阅数据存储。)使用 mpsGet*
数组访问例程从 mpsArray
读取数据。
操作数据
mpsGet*
数组访问例程获取对 mpsArray
中数据的引用。使用这些例程来修改客户端应用程序中的数据。每个函数提供对 mpsArray
中特定信息的访问。一些有用的函数是 mpsGetData()
、mpsGetPr()
、mpsGetM()
和 mpsGetString()
。以下语句将输入字符数组 prhs[0]
读入 C 样式字符串 buf
:
char *buf; int buflen; int status; buflen = mpsGetN(prhs[0])*sizeof(mpsChar)+1; buf = malloc(buflen); status = mpsGetString(prhs[0], buf, buflen);