MATLAB®语言使用单一对象类型:MATLAB数组。所有MATLAB变量(包括标量、向量、矩阵、字符数组、单元格数组、结构和对象)都存储为MATLAB数组。在C/ c++中,MATLAB数组被声明为类型mxArray
.的mxArray
结构包含关于数组的以下信息:
它的类型
它的尺寸
与该数组关联的数据
如果是数值,则变量是实数还是复数
如果是稀疏的,它的索引和非零的最大元素
如果是结构或对象,则表示字段的数目和字段名
访问mxArray
结构,使用C或Fortran矩阵api中的函数。这些函数允许您在MEX文件中创建、读取和查询有关MATLAB数据的信息。矩阵api使用mwSize
而且mwIndex
类型,以避免可移植性问题,并允许在所有系统上正确编译MEX源文件。
像MATLAB函数一样,一个mexo文件网关程序通过引用传递MATLAB变量。然而,这些参数是C指针。一个指针变量的地址(在内存中的位置)的变量。MATLAB函数自动为您处理数据存储。在将数据传递给mex文件时,使用指针,指针遵循访问和操作变量的特定规则。有关使用指针的信息,请参阅编程参考,例如C语言作者:克尼根,B. W.和D. M.里奇。
请注意
由于变量使用内存,您需要了解mexo文件如何创建一个mxArray
以及你释放内存的责任。这对于防止内存泄漏非常重要。生命周期mxArray
—以及管理内存的规则—取决于它是输入参数、输出参数还是局部变量。释放对象的函数mxArray
这取决于创建它时使用的函数。类中创建数组的函数,以获取更多信息C矩阵API.
prhs
一个mxArray
参数传递给一个mex文件prhs
input参数存在于墨西哥文件的作用域之外。不释放内存为任何mxArray
在prhs
参数。同时,prhs
变量是只读的;不要在mexo文件中修改它们。
plhs
如果你创建一个mxArray
(分配内存并创建数据)对于输出参数,内存和数据超出了mexo文件的范围。不释放内存mxArray
返回于plhs
输出参数。
类型时分配内存mxCreate *
函数创建mxArray
或者当你打电话给mxCalloc
和相关的函数。在遵守了处理输入和输出参数的规则之后,mex文件应该销毁临时数组并释放动态分配的内存。要释放内存,可以使用任意一种mxDestroyArray
或mxFree
.有关要使用哪个函数的信息,请参见MX矩阵库.
MATLAB以列-主(按列)编号方案存储数据,Fortran就是这样存储矩阵的。MATLAB使用这种约定,因为它最初是用Fortran编写的。MATLAB首先在内部存储第一列的数据元素,然后再存储第二列的数据元素,依次存储到最后一列。
例如,给定矩阵:
A = [“房子”;“地板”;“玄关”]
房子地板门廊
其维度为:
大小(一个)
Ans = 3 5
其数据存储为:
如果一个矩阵是n维的,MATLAB表示n大调的数据。例如,考虑一个具有维度的三维数组4
——- - - - - -2
——- - - - - -3.
.尽管您可以将数据可视化为:
MATLAB在内部表示这个三维数组的数据,顺序如下:
一个 |
B |
C |
D |
E |
F |
G |
H |
我 |
J |
K |
l |
米 |
N |
O |
P |
问 |
R |
年代 |
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 |
的mxCalcSingleSubscript
函数使用n维下标创建从数组的第一个元素到所需元素的偏移量。
MATLAB中最常见的数据类型是复杂的双精度非稀疏矩阵。这些矩阵是有类型的双
有维度米
——- - - - - -n
,在那里米
行数是和吗n
是列数。数据存储为交错的双精度数向量,其中实部和虚部彼此相邻存储。指向该数据的指针称为巴勒斯坦权力机构
(指向数组的指针)要测试一个非复矩阵,调用mxIsComplex
.
在MATLAB Version 9.4 (R2018a)之前,MATLAB使用了单独的存储表示。数据存储为两个双精度数向量——一个包含真实数据,一个包含虚数据。指向该数据的指针称为公关
(指向实际数据的指针)和π
(指向虚数据的指针),分别。一个非复矩阵是π
是零
.然而,为了测试一个非复矩阵,调用mxIsComplex
.
MATLAB支万博1manbetx持单精度浮点数和8位、16位、32位和64位整数,包括有符号和无符号整数。
逻辑数据类型表示逻辑数据类型真正的
或假
用数字陈述1
而且0
,分别。某些MATLAB函数和运算符返回逻辑1
或逻辑0
表示某一条件被发现是否正确。例如,语句(5 * 10) >
返回一个逻辑1
价值。
字符
数组MATLAB字符
数组将数据存储为无符号16位整数。转换MATLAB字符
数组转换为c风格字符串,调用mxArrayToString
.将c风格字符串转换为字符
数组,调用mxCreateString
.
单元格数组是MATLAB数组的集合,其中每个mxArray
称为单元格。单元格数组允许将不同类型的MATLAB数组存储在一起。单元格数组的存储方式与数值矩阵类似,只是数据部分包含指向的单个向量mxArrays
.这个向量的成员称为单元格。每个单元格可以是任何受支持的数据类型,甚至是另一万博1manbetx个单元格数组。
一个1
——- - - - - -1
结构的存储方式与1
——- - - - - -n
单元格数组n
结构中的字段数。数据向量的成员称为字段。对象中存储的名称与每个字段相关联mxArray
.
对象的存储和访问方式与结构相同。在MATLAB中,对象是带有注册方法的命名结构。在MATLAB之外,对象是一种结构,它包含用于标识对象名称的附加类名的存储。
任何类型的MATLAB数组都可以是多维的。存储一个整数向量,其中每个元素都是相应维度的大小。数据的存储方法与矩阵相同。
任何类型的MATLAB数组都可以为空。一个空mxArray
至少有一个维数等于0。例如,双精度mxArray
类型的双
,在那里米
而且n
等于0和巴勒斯坦权力机构
是零
,是一个空数组。
在MATLAB中,稀疏矩阵与完整矩阵有不同的存储约定。的参数巴勒斯坦权力机构
仍然是双精度数或逻辑值的数组,但此数组仅包含非零数据元素。
还有三个附加参数:nzmax
,红外
,jc
.使用mwSize
而且mwIndex
类型,当为这些参数声明变量时。
nzmax
的长度是否为整数红外
而且巴勒斯坦权力机构
.它是稀疏矩阵中非零元素的最大数目。
红外
指向一个长度为整数的数组nzmax
中对应元素的行索引巴勒斯坦权力机构
.
jc
指向一个长度为整数的数组n + 1
,在那里n
是稀疏矩阵中的列数。在C语言中,字母的第一个元素mxArray
索引为0。的jc
数组包含列索引信息。如果j
稀疏矩阵的第列有任何非零元素,jc [j]
索引是红外
而且巴勒斯坦权力机构
的第一个非零元素的j
列。指数Jc [j+1] - 1
包含该列中的最后一个非零元素。为j
稀疏矩阵的第1列,jc [j]
是前面所有列中非零元素的总数。的最后一个元素jc
数组,jc [n]
,等于nnz
,整个稀疏矩阵中非零元素的个数。如果nnz
小于nzmax
,可以向数组中插入更多的非零项,而无需分配更多的存储空间。
您可以在C/ c++中编写源MEX文件、mat文件应用程序和引擎应用程序,这些应用程序接受MATLAB支持的任何类或数据类型(请参阅万博1manbetx数据类型).在Fortran中,只能创建双精度n
——- - - - - -米
支持数组和字符串。万博1manbetx你使用二进制C/ c++和Fortran MEX文件像MATLAB函数。
谨慎
MATLAB不检查用C/ c++或Fortran创建的MATLAB数据结构的有效性,使用矩阵库创建函数之一(例如,mxCreateStructArray
).使用无效语法创建MATLAB数据结构可能会导致C/ c++或Fortran程序出现意外行为。
要处理MATLAB数组,请使用typemxArray
.下面的语句声明了一个mxArray
命名myData
:
mxArray * myData;
的值myData
,使用其中之一mxCreate *
功能。下面是一些有用的数组创建例程mxCreateNumericArray
,mxCreateCellArray
,mxCreateCharArray
.例如,下面的语句分配一个米
——- - - - - -1
浮点mxArray
初始化为0
:
myData = mxCreateDoubleMatrix(m, 1, mxREAL);
C/ c++程序员应该注意MATLAB数组中的数据是按列-主序排列的。(有关说明,请参见数据存储)。使用MATLABmxGet *
数组访问例程,从mxArray
.
的mxGet *
数组访问例程获取对数据的引用mxArray
.使用这些例程修改MEX文件中的数据。类中的特定信息的访问mxArray
.一些有用的函数是mxGetDoubles
,mxGetComplexDoubles
,mxGetM
,mxGetString
.这些函数很多都有对应的mxSet *
例程,以允许您修改数组中的值。
下面的语句读取输入prhs [0]
变成c风格的字符串缓冲区
.
char *缓冲区;int buflen;int状态;buflen = mxGetN(prhs[0])*sizeof(mxChar)+1;buf = mxMalloc(buflen);status = mxGetString(prhs[0], buf, buflen);
探索
例子有一个实例源MEX文件包含在MATLAB中,叫做explore.c
,它标识输入变量的数据类型。本例的源代码在matlabroot
走读生/ /墨西哥人例子
,在那里matlabroot
表示系统上安装MATLAB的顶级文件夹。
请注意
在涉及文件夹路径的独立于平台的讨论中,本文档使用UNIX®公约。的一般引用墨西哥人
文件夹是matlabroot
走读生/ /墨西哥人例子
.
要构建示例MEX文件,首先将该文件复制到路径上的可写文件夹。
拷贝文件(fullfile (matlabroot,“外来的”,“例子”,墨西哥人的,“explore.c”),“。”,“f”)
使用墨西哥人
命令生成MEX文件。
墨西哥人explore.c-R2018a
类型:
X = 2;探索(x)
------------------------------------------------ 名称:prhs[0]维度:1 x1类名:双 ------------------------------------------------ ( 1, - 1) = 2
探索
接受任何数据类型。试着用探索
下面是一些例子:
探索([1 2 3 4 5]123.45探索({1 2 3 4 5})探索(int8([1 2 3 4 5]){1 2 3 4 5}探索(稀疏(眼(5)))探索(结构体(“名字”,“乔琼斯”,“ext”, 7332))探索(1,2,3,4,5)探索(复杂(3,4))