MATLAB 数据 您所在的位置:网站首页 matlab保存数组 MATLAB 数据

MATLAB 数据

2023-12-05 15:11| 来源: 网络整理| 查看: 265

MATLAB 数据MATLAB 数组

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

数组的类型

数组的维度

与此数组相关联的数据

如果是数值数组,则指出变量的复实性

如果是稀疏数组,则提供它的索引和非零最大元素

如果是结构体数组或对象数组,则提供字段的数量和字段名称

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

mxArray 的生命周期

像 MATLAB 函数一样,MEX 文件入口例程按引用传递 MATLAB 变量。但是,这些参数是 C 指针。指向变量的指针是该变量的地址(在内存中的位置)。MATLAB 函数自动为您处理数据存储。在将数据传递给 MEX 文件时,您需要使用指针,这些指针遵循访问和操作变量的特定规则。有关使用指针的信息,请参阅编程参考,如 Kernighan, B. W. 和 D. M. Ritchie 编写的 The C Programming Language。

注意

由于变量使用内存,您需要了解 MEX 文件如何创建 mxArray 以及您释放(腾出)内存的责任。这对于防止内存泄漏非常重要。mxArray 的生命周期以及管理内存的规则取决于它是输入参数、输出参数还是局部变量。调用哪个函数来取消分配 mxArray 取决于您用来创建它的函数。有关详细信息,请在 C 矩阵 API 中查找用于创建数组的函数。

输入参数 prhs

通过 prhs 输入参数传递给 MEX 文件的 mxArray 存在于 MEX 文件的范围之外。不要为 prhs 参数中的任何 mxArray 释放内存。此外,prhs 变量是只读的;不要在您的 MEX 文件中修改它们。

输出参数 plhs

如果为输出参数创建 mxArray(分配内存并创建数据),则内存和数据会超出 MEX 文件的范围。不要为 plhs 输出参数中返回的 mxArray 释放内存。

局部变量

每次您使用 mxCreate* 函数创建 mxArray 或调用 mxCalloc 及关联的函数时,都会分配内存。在遵守处理输入和输出参数的规则的情况下,MEX 文件应该销毁临时数组并释放动态分配的内存。要取消分配内存,请使用 mxDestroyArray 或 mxFree。有关要使用哪个函数的信息,请参阅 MX Matrix Library。

数据存储

MATLAB 采用列优先(逐列)编号方案存储数据,这是 Fortran 存储矩阵的方式。MATLAB 使用此约定,因为它最初是用 Fortran 编写的。MATLAB 首先在内部存储来自第一列的数据元素,然后继续存储来自第二列的数据元素,以此类推,直到最后一列。

例如,给定矩阵:

a = ['house'; 'floor'; 'porch'] a = house floor porch

其维度是:

size(a) ans = 3 5

其数据存储为:

如果一个矩阵是 N 维矩阵,则 MATLAB 以 N 优先的顺序表示数据。例如,以维度为 4×2×3 的三维数组为例。尽管您可以将数据可视化为:

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

mxCalcSingleSubscript 函数使用 N 维下标创建从数组的第一个元素到所需元素的偏移量。

MATLAB 数据类型复数双精度矩阵

MATLAB 中最常见的数据类型是复数双精度非稀疏矩阵。这些矩阵是 double 类型,维度为 m×n,其中 m 为行数,n 为列数。数据存储为一个由交错式双精度数字构成的向量,其中实部和虚部彼此相邻存储。指向此数据的指针称为 pa(指向数组的指针)。要测试非复矩阵,请调用 mxIsComplex。

在 MATLAB 版本 9.4(版本 2018a)之前,MATLAB 使用分离式存储表示。数据存储为两个由双精度数值构成的向量 - 一个向量包含实数数据,另一个向量包含虚数数据。指向此数据的指针分别称为 pr(指向实数数据的指针)和 pi(指向虚数数据的指针)。非复矩阵是其 pi 为 NULL 的矩阵。但是,要测试非复矩阵,请调用 mxIsComplex。

其他数值矩阵

MATLAB 支持单精度浮点数以及 8、16、32 和 64 位整数,包括有符号数和无符号数。

逻辑矩阵

逻辑数据类型分别使用数字 1 和 0 表示逻辑值 true 或 false。某些 MATLAB 函数和运算符返回逻辑值 1 或逻辑值 0 以指示某个条件是否为真。例如,语句 (5 * 10) > 40 返回逻辑值 1。

MATLAB char 数组

MATLAB char 数组将数据存储为无符号 16 位整数。要将 MATLAB char 数组转换为 C 样式的字符串,请调用 mxArrayToString。要将 C 样式的字符串转换为 char 数组,请调用 mxCreateString。

元胞数组

元胞数组是 MATLAB 数组的集合,其中每个 mxArray 称为一个元胞。元胞数组可以将不同类型的 MATLAB 数组存储在一起。元胞数组的存储方式与数值矩阵类似,区别在于数据部分包含一个由指向 mxArrays 的指针构成的向量。此向量的成员称为元胞。每个元胞可以是任何受支持的数据类型,甚至可以是另一个元胞数组。

结构体

1×1 结构体的存储方式与 1×n 元胞数组相同,其中 n 是结构体中的字段数。数据向量的成员称为字段。每个字段都与在 mxArray 中存储的一个名称关联。

对象

对象的存储和访问方式与结构体相同。在 MATLAB 中,对象是具有已注册方法的命名结构体。在 MATLAB 之外,作为一种结构体,对象包含用于标识对象名称的附加类名称的存储。

多维数组

任何类型的 MATLAB 数组都可以是多维的。整数向量的存储方式是每个元素都具有对应维度的大小。数据的存储方式与矩阵相同。

空数组

任何类型的 MATLAB 数组都可以是空数组。空 mxArray 表示它至少有一个维度等于零。例如,double 类型的双精度 mxArray,其中 m 和 n 等于 0 且 pa 是 NULL,则它是一个空数组。

稀疏矩阵

在 MATLAB 中,稀疏矩阵与满矩阵采用不同的存储约定。参数 pa 仍然是双精度数字或逻辑值的数组,但此数组仅包含非零数据元素。

还有三个参数:nzmax、ir 和 jc。声明这些参数的变量时,请使用 mwSize 和 mwIndex 类型。

nzmax 是包含 ir 和 pa 长度的整数。它是稀疏矩阵中非零元素的最大数量。

ir 指向长度 nzmax 的整数数组,其中包含 pa 中相应元素的行索引。

jc 指向长度 n+1 的整数数组,其中 n 是稀疏矩阵中的列数。在 C 中,mxArray 的第一个元素的索引为 0。jc 数组包含列索引信息。如果稀疏矩阵的第 j 列具有任何非零元素,则 jc[j] 表示第 j 列中的第一个非零元素的 ir 和 pa 的索引。索引 jc[j+1] - 1 包含该列中的最后一个非零元素。对于稀疏矩阵的第 j 列,jc[j] 是前面所有列中非零元素的总数。jc 数组的最后一个元素 jc[n] 等于 nnz,即整个稀疏矩阵中非零元素的数量。如果 nnz 小于 nzmax,则可以在不分配更多存储的情况下将更多非零项插入数组中。

使用数据类型

您可以使用 C/C++ 编写源 MEX 文件、MAT 文件应用程序和引擎应用程序,它们接受 MATLAB 支持的任何类或数据类型(请参阅数据类型)。在 Fortran 中,仅支持创建双精度 n×m 数组和字符串。您可以使用二进制 C/C++ 和 Fortran MEX 文件,如 MATLAB 函数。

注意

MATLAB 不检查使用 Matrix Library 创建函数(例如 mxCreateStructArray)在 C/C++ 或 Fortran 中创建的 MATLAB 数据结构体的有效性。使用无效语法创建 MATLAB 数据结构体可能会导致您的 C/C++ 或 Fortran 程序出现意外行为。

声明数据结构体

要处理 MATLAB 数组,请使用 mxArray 类型。以下语句声明名为 myData 的 mxArray:

mxArray *myData;

要定义 myData 的值,请使用 mxCreate* 函数之一。一些数组创建例程很有用,如 mxCreateNumericArray、mxCreateCellArray 和 mxCreateCharArray。例如,以下语句分配一个初始化为 0 的 m×1 浮点 mxArray:

myData = mxCreateDoubleMatrix(m, 1, mxREAL);

C/C++ 编程人员应该注意,MATLAB 数组中的数据按列优先顺序排列。有关说明,请参阅数据存储。使用 MATLAB mxGet* 数组访问例程来读取 mxArray 中的数据。

操作数据

mxGet* 数组访问例程获取对 mxArray 中数据的引用。使用这些例程来修改 MEX 文件中的数据。每个函数用于访问 mxArray 中的特定信息。这些实用的函数包括 mxGetDoubles、mxGetComplexDoubles、mxGetM 和 mxGetString。其中许多函数都有相应的 mxSet* 例程,您可用来修改数组中的值。

以下语句将输入 prhs[0] 读入 C 样式的字符串 buf 中。

char *buf; int buflen; int status; buflen = mxGetN(prhs[0])*sizeof(mxChar)+1; buf = mxMalloc(buflen); status = mxGetString(prhs[0], buf, buflen); explore 示例

MATLAB 附带一个名为 explore.c 的示例源 MEX 文件,用于标识输入变量的数据类型。此示例的源代码位于 matlabroot/extern/examples/mex 中,其中 matlabroot 表示在您的系统上安装 MATLAB 的顶层文件夹。

注意

在涉及文件夹路径的与平台无关的讨论中,本文档使用 UNIX® 约定。例如,对 mex 文件夹的一般引用是 matlabroot/extern/examples/mex。

要编译示例 MEX 文件,请首先将文件复制到路径上的一个可写文件夹中。

copyfile(fullfile(matlabroot,'extern','examples','mex','explore.c'),'.','f')

使用 mex 命令编译 MEX 文件。

mex explore.c -R2018a

键入:

x = 2; explore(x)------------------------------------------------ Name: prhs[0] Dimensions: 1x1 Class Name: double ------------------------------------------------ (1,1) = 2

explore 可以接受任何数据类型。尝试对以下示例使用 explore:

explore([1 2 3 4 5]) explore 1 2 3 4 5 explore({1 2 3 4 5}) explore(int8([1 2 3 4 5])) explore {1 2 3 4 5} explore(sparse(eye(5))) explore(struct('name', 'Joe Jones', 'ext', 7332)) explore(1, 2, 3, 4, 5) explore(complex(3,4)) 相关主题数据类型


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有