在MATLAB®语言只处理一个对象类型:MATLAB数组。所有MATLAB变量(包括标量、向量、矩阵、字符数组、单元数组、结构和对象)都存储为MATLAB数组。在C/ c++中,MATLAB数组被声明为类型mxArray
.的mxArray
结构包含以下有关数组的信息:
它的类型
它的尺寸
与此阵列相关联的数据
如果数值,变量是真实的还是复杂
如果稀疏,其指数和非零最大的元素
如果结构或对象,字段和字段名的数量
要访问mxArray
结构,使用函数在C或Fortran矩阵api。这些函数允许您在您的MEX文件中创建、读取和查询关于MATLAB数据的信息。矩阵api使用mwSize
和mwIndex
类型以避免移植问题,并允许MEX源文件正确地在所有系统上编译。
像MATLAB功能,一个MEX文件网关程序通过引用传递MATLAB变量。然而,这些参数是C指针。一个指针一个变量是地址可变的(在存储器位置)。MATLAB功能自动处理数据存储为您服务。当将数据传递到一个MEX文件,你使用指针,下面用于访问和操作变量的具体规则。有关使用指针的工作信息,请参阅编程参考,如C语言程序设计语言作者:Kernighan, B. W.,和D. M. Ritchie。
由于变量使用内存,您需要了解mex文件如何创建一个mxArray
和你的释放(释放)内存责任。这一点很重要,以防止内存泄漏。的生命周期mxArray
-and用于管理规则记忆取决于它是否是输入参数,输出参数,或局部变量。你打电话取消分配的功能mxArray
取决于你用来创建它的功能。欲了解更多信息,请查阅功能创建的阵列体基质API.
prhs
一个mxArray
通过传递给MEX文件prhs
输入参数存在MEX-文件的范围之内。做任何释放内存mxArray
在里面prhs
参数。也,prhs
变量是只读的;不要修改他们在您的MEX文件。
plhs
如果创建mxArray
为一个输出参数(分配内存和创建数据),存储器和数据存在超越MEX-文件的范围。做一个不自由的内存mxArray
返回的plhs
输出参数。
每当使用时,都要分配内存mxCreate *
函数创建一个mxArray
或者当你调用mxCalloc
和相关的功能。在观察了处理输入和输出参数的规则之后,mex文件应该销毁临时数组并释放动态分配的内存。要释放内存,可以使用其中之一mxDestroyArray
要么mxFree
.有关哪些功能使用,请参阅MX矩阵库.
在一列优先(列方向)的编号方案,这是如何存储的Fortran矩阵MATLAB存储数据。MATLAB采用了这种约定,因为它最初是用Fortran语言编写。MATLAB内部存储数据从第一列元件,然后再从第二塔的第二数据元素,依此类推,通过最后一列。
例如,给定的矩阵:
A = [“房子”;'地板';“玄关”]
A =房子地板门廊
它的尺寸为:
尺寸(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
是列的数目。数据存储为交错的双精度数字向量,实部和虚部相邻存储。指向该数据的指针称为PA
(指针数组)。为了测试一个不复杂的矩阵,通话mxIsComplex
.
在MATLAB版本9.4 (R2018a)之前,MATLAB使用了a分离存储表示。数据以双精度数字的两个向量的形式存储—一个包含实际数据,另一个包含虚构数据。指向该数据的指针称为PR
(指向真实数据)和PI
(指向虚构数据的指针)。一个非复矩阵是它的PI
是空值
.但是,要测试非复矩阵,调用mxIsComplex
.
MATLAB支金宝app持单精度浮点和8位,16位,32位和64位整数,有符号和无符号。
逻辑数据类型表示逻辑真正
要么假
说明使用数字1
和0
, 分别。某些MATLAB函数和运算符返回逻辑1
或逻辑0
表明某一条件是否成立。例如,语句(5 * 10) > 40
返回逻辑1
值。
烧焦
数组MATLAB烧焦
阵列将数据存储为无符号的16位整数。要转换MATLAB烧焦
数组到c风格的字符串,调用mxArrayToString
.要在C风格的字符串转换为烧焦
阵,召唤mxCreateString
.
单元阵列是MATLAB阵列,其中每个集合mxArray
被称为小区。单元阵列允许不同类型的MATLAB阵列一起存储。单元阵列被存储在类似的方式到数字矩阵,除了数据部分包含指针的到单个载体mxArrays
.该向量的成员被称为细胞。每个单元可以是任何支持的数据类型,即使另一单元阵金宝app列的。
一个1
-通过-1
结构以与a相同的方式存储1
-通过-n
单元阵列,n
是在结构中的字段的数量。数据载体的成员被称为字段。每个字段存储在一个名称关联mxArray
.
对象存储和访问的方式相同的结构。在MATLAB中,对象被命名为登记方法的结构。外MATLAB,对象是包含存储额外的类名的结构,即标识对象的名称。
任何类型的MATLAB阵列可以是多维的。整数的向量被存储,其中每个元素是对应的尺寸的大小。的数据的存储方法是一样的矩阵。
任何类型的MATLAB阵列可以是空的。空mxArray
至少有一个维度等于零。例如,双精度mxArray
类型的双
,其中米
和n
等于0,PA
是空值
,为空数组。
稀疏矩阵具有从MATLAB全矩阵不同的存储惯例。参数PA
仍然是由双精度数字或逻辑值组成的数组,但该数组只包含非零数据元素。
有三个附加参数:nzmax
,红外
和jc
.使用mwSize
和mwIndex
声明这些参数变量时的类型。
nzmax
是包含的长度的整数红外
和PA
.它是在稀疏矩阵的非零元素的最大数量。
红外
分长度的整阵列nzmax
包含在相应元素的行索引PA
.
jc
分长度的整阵列n + 1个
,其中n
是列在稀疏矩阵的数量。在C中,一个第一元件mxArray
索引为0。的jc
数组包含列索引信息。如果j
稀疏矩阵的列具有任何非零元素,jc [j]
是索引红外
和PA
的第一个非零元素j
列。指数JC [J + 1] - 1
包含该列中的最后一个非零元素。为j
稀疏矩阵的第列,jc [j]
为前一列中所有非零元素的总数。的最后一个元素jc
数组,JC [n]的
,等于NNZ
,整个稀疏矩阵中非零元素的个数。如果NNZ
小于nzmax
更非零项能够被插入到该阵列而不分配更多的存储。
您可以用C/ c++编写接受MATLAB支持的任何类或数据类型的源MEX文件、mat文件应用程序和引擎应用程序(参见金宝app数据类型)。在Fortran中,只有创造双精度n
-通过-米
数组和字符串的支持。金宝app您可以使用二进制C / C ++和Fortran MEX文件,如MATLAB功能。
MATLAB不检查用C/ c++或Fortran创建的MATLAB数据结构的有效性,这些数据结构使用矩阵库中的create函数之一(例如,mxCreateStructArray
)。使用无效的语法来创建MATLAB数据结构可能会导致您的C/ c++或Fortran程序中出现意想不到的行为。
为了处理MATLAB阵列,使用类型mxArray
.下面的语句声明了一个mxArray
命名MYDATA的
:
mxArray * myData;
定义的值MYDATA的
使用的一个mxCreate *
功能。一些有用的数组创建例程mxCreateNumericArray
,mxCreateCellArray
和mxCreateCharArray
.例如,下面的语句的分配米
-通过-1
浮点mxArray
初始化为0
:
myData = mxcreatedouatrix (m, 1, mxREAL);
C / C ++程序员应该注意在一个MATLAB阵列数据是在列主顺序。(有关的说明,请参见数据存储)。使用MATLABmxGet *
阵列访问例程读取从数据mxArray
.
的mxGet *
数组访问程序获得的该数据引用mxArray
.使用这些程序在你的MEX文件来修改数据。每个函数可以访问的具体信息mxArray
.以下是一些有用的函数mxGetDoubles
,mxGetComplexDoubles
,mxGetM
和mxGetString
.许多这些功能都有相应的mxSet *
程序,让您可以在阵列中修改值。
下面的语句读取输入prhs [0]
成C风格的字符串BUF
.
字符* BUF;诠释buflen;INT状态;buflen = mxGetN(prhs [0])*的sizeof(mxChar)+1;BUF = mxMalloc(buflen);状态= mxGetString(prhs [0],buf中,buflen);
探索
例子里面包括有MATLAB的例子源MEX文件,名为explore.c
中,标识的输入变量的数据的类型。在这个例子中的源代码是在matlabroot
走读生/ /墨西哥人例子
,其中matlabroot
代表那里MATLAB是安装在系统上的顶层文件夹。
在涉及文件夹路径的与平台无关的讨论中,本文档使用UNIX®惯例。例如,一般的参考MEX
文件夹matlabroot
走读生/ /墨西哥人例子
.
要构建示例MEX文件,第一次将文件复制到可写文件夹路径。
拷贝文件(fullfile (matlabroot,'EXTERN','例子',墨西哥人的,'explore.c'),“。”,'F')
使用MEX
命令来构建MEX文件。
MEXexplore.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))