主要内容

MATLAB数据

MATLAB数组

MATLAB®语言使用单一对象类型:MATLAB数组。所有MATLAB变量(包括标量、向量、矩阵、字符数组、单元格数组、结构和对象)都存储为MATLAB数组。在C/ c++中,MATLAB数组被声明为类型mxArray.的mxArray结构包含关于数组的以下信息:

  • 它的类型

  • 它的尺寸

  • 与该数组关联的数据

  • 如果是数值,则变量是实数还是复数

  • 如果是稀疏的,它的索引和非零的最大元素

  • 如果是结构或对象,则表示字段的数目和字段名

访问mxArray结构,使用C或Fortran矩阵api中的函数。这些函数允许您在MEX文件中创建、读取和查询有关MATLAB数据的信息。矩阵api使用mwSize而且mwIndex类型,以避免可移植性问题,并允许在所有系统上正确编译MEX源文件。

mxArray的生命周期

像MATLAB函数一样,一个mexo文件网关程序通过引用传递MATLAB变量。然而,这些参数是C指针。一个指针变量的地址(在内存中的位置)的变量。MATLAB函数自动为您处理数据存储。在将数据传递给mex文件时,使用指针,指针遵循访问和操作变量的特定规则。有关使用指针的信息,请参阅编程参考,例如C语言作者:克尼根,B. W.和D. M.里奇。

请注意

由于变量使用内存,您需要了解mexo文件如何创建一个mxArray以及你释放内存的责任。这对于防止内存泄漏非常重要。生命周期mxArray—以及管理内存的规则—取决于它是输入参数、输出参数还是局部变量。释放对象的函数mxArray这取决于创建它时使用的函数。类中创建数组的函数,以获取更多信息C矩阵API

输入参数prhs

一个mxArray参数传递给一个mex文件prhsinput参数存在于墨西哥文件的作用域之外。不释放内存为任何mxArrayprhs参数。同时,prhs变量是只读的;不要在mexo文件中修改它们。

输出参数plhs

如果你创建一个mxArray(分配内存并创建数据)对于输出参数,内存和数据超出了mexo文件的范围。不释放内存mxArray返回于plhs输出参数。

局部变量

类型时分配内存mxCreate *函数创建mxArray或者当你打电话给mxCalloc和相关的函数。在遵守了处理输入和输出参数的规则之后,mex文件应该销毁临时数组并释放动态分配的内存。要释放内存,可以使用任意一种mxDestroyArraymxFree.有关要使用哪个函数的信息,请参见MX矩阵库

数据存储

MATLAB以列-主(按列)编号方案存储数据,Fortran就是这样存储矩阵的。MATLAB使用这种约定,因为它最初是用Fortran编写的。MATLAB首先在内部存储第一列的数据元素,然后再存储第二列的数据元素,依次存储到最后一列。

例如,给定矩阵:

A = [“房子”“地板”“玄关”
房子地板门廊

其维度为:

大小(一个)
Ans = 3 5

其数据存储为:

数据布局是h f p o o o o o r s o c e r h。

如果一个矩阵是n维的,MATLAB表示n大调的数据。例如,考虑一个具有维度的三维数组4——- - - - - -2——- - - - - -3..尽管您可以将数据可视化为:

排列在三个数据页上的字母A-H, I-P和Q-X。

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数据类型

复双精度矩阵

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字符数组

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 *功能。下面是一些有用的数组创建例程mxCreateNumericArraymxCreateCellArray,mxCreateCharArray.例如,下面的语句分配一个——- - - - - -1浮点mxArray初始化为0

myData = mxCreateDoubleMatrix(m, 1, mxREAL);

C/ c++程序员应该注意MATLAB数组中的数据是按列-主序排列的。(有关说明,请参见数据存储)。使用MATLABmxGet *数组访问例程,从mxArray

操作数据

mxGet *数组访问例程获取对数据的引用mxArray.使用这些例程修改MEX文件中的数据。类中的特定信息的访问mxArray.一些有用的函数是mxGetDoublesmxGetComplexDoublesmxGetM,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))

相关的话题