【MATLAB 入门指南 三】数据类型与文件读写

0. 数据类型

MATLAB 官方文档对数据类型进行了详细介绍:MATLAB官方文档

1. 数值类型(numeric)

MATLAB中,数值类型的变量被默认为double类型的,可以使用类型转换将其转换为其他数值类型. MATLAB 官方文档:数据类型

n = 3;
class(n)	% 得到 doublen = int8(3);
class(n)	% 得到 int8

执行结果:

ans ='double'ans ='int8'
数值类型描述
double双精度浮点数
single单精度浮点数
int88位带符号整数
int1616位带符号整数
int3232位带符号整数
int6464位带符号整数
uint88位无符号整数
uint1616位无符号整数
uint3232位无符号整数
uint6464位无符号整数

类型转换:

在这里插入图片描述

2. 字符串类型(char)

2.1 字符数组

  • MATLAB中,字符串类型由一对单引号'包裹一段文字来定义.标准ASCII字符可以被转换为对应的ASCII码. ASCII 表

  • 一个字符在ASCll中使用0255之间的数字代码表示

>> s1 = 'h';
>> whosName      Size            Bytes  Class     Attributesans       1x1                 2  uint16              s1        1x1                 2  char                >> uint16(s1)ans =uint16104>> s2 = 'H';
>> whosName      Size            Bytes  Class     Attributesans       1x1                 2  uint16              s1        1x1                 2  char                s2        1x1                 2  char                >> uint16(s2)ans =uint1672
  • 字符串在内存中是以字符矩阵的形式存储的,可以对其进行矩阵的索引以及赋值操作:
字符串拼接:
>> s1='Example';
>> s2='String';
>> s3=[s1 s2]s3 ='ExampleString'>> s3=[s1; s2]
错误使用 vertcat
要串联的数组的维度不一致。

逻辑操作与赋值:

>> str = 'aardvark'; 
>> str(3)ans ='r'>> 'a' == strans =1×8 logical 数组1   1   0   0   0   1   0   0>> str=='a'ans =1×8 logical 数组1   1   0   0   0   1   0   0>> str(str == 'a') = 'Z'str ='ZZrdvZrk'

实例练习:

>> s1='I like the letter E's1 ='I like the letter E'
-------------------------------------------------------
>> s2 = s1(size(s1,2):-1:1)s2 ='E rettel eht ekil I'
-------------------------------------------------------
>> s2 = s1(length(s1):-1:1)s2 ='E rettel eht ekil I'
-------------------------------------------------------
>> help reverse
reverse - 反转字符串中的字符顺序此 MATLAB 函数 反转 str 中字符的顺序。newStr = reverse(str)另请参阅 eq, flip, fliplr, lower, replace, reshape, upperreverse 的文档名为 reverse 的其他函数>> reverse(s1)ans ='E rettel eht ekil I'
----------------------------------------------------->> help flip
flip - 翻转元素顺序此 MATLAB 函数 返回的数组 B 具有与 A 相同的大小,但元素顺序已反转。B 中重新排序的维度取决于 A 的形状:B = flip(A)B = flip(A,dim)另请参阅 fliplr, flipud, permute, rot90, transposeflip 的文档名为 flip 的其他函数>> flip(s1)ans ='E rettel eht ekil I'

2.2 文本(字符串)

  • 当处理文本时,将字符序列括在双引号中,可以将文本赋给变量,此时存储的字符串是一个整体,不同于字符数组,分割开的
>> s = "Hello, world"s = "Hello, world">> s(1)ans = "Hello, world">> c = 'Hello, world'c ='Hello, world'>> c(1)ans ='H'

在这里插入图片描述

  • 如果文本包含双引号,在定义中使用两个双引号
>> q = "Something ""quoted"" and something else."q = "Something "quoted" and something else."
  • 文本添加到字符串的末尾,使用加号运算符 +
>> f = 71;
c = (f-32)/1.8;
tempText = "Temperature is " + c + "C"tempText = "Temperature is 21.6667C"
  • 与数值数组类似,字符串数组可以有多个元素
>> A = ["a","bb","ccc"; "dddd","eeeeee","fffffff"]A = 2×3 string 数组"a"       "bb"        "ccc"    "dddd"    "eeeeee"    "fffffff"
  • 使用 strlength 函数求数组中每个字符串的长度
>> strlength(A)ans =1     2     34     6     7
  • 可以使用花括号 {} 对字符串数组进行索引以直接访问字符
>> str = ["Mercury","Gemini","Apollo";"Skylab","Skylab B","ISS"];
>> chr = str{2,2}chr ='Skylab B'>> str{2,2}(1:3)ans ='Sky'

3. 结构体(structure)

MATLAB中,结构体是一个存储{键: 值}的数据结构,类似于 Python 语言中的字典.

3.1 创建结构体

  • 与大多数编程语言类似,MATLAB 使用.来访问结构体中的字段:
>> student.name = 'John Doe';
>> student.id = 'jdo2@sfu.ca';
>> student.number = 301073268;
>> student.grade = [100, 75, 73; ...95, 91, 85.5; ...100, 98, 72];
>> studentstudent = 包含以下字段的 struct:name: 'John Doe'id: 'jdo2@sfu.ca'number: 301073268grade: [3×3 double]

3.2 利用下标对结构体进行扩充或删减

在这里插入图片描述

>> student(2).name = 'Ann Lane';
>> student(2).id = 'aln4@sfu.ca';
>> student(2).number = 301078853;
>> student(2).grade = [95 100 90; 95 82 97; 100 85 100];
>> studentstudent = 包含以下字段的 1×2 struct 数组:nameidnumbergrade>> student(1) = []		% 删除student列表第一项student = 包含以下字段的 struct:name: 'Ann Lane'id: 'aln4@sfu.ca'number: 301078853grade: [3×3 double]

3.3 提取结构体中的值

>> student(1).grade(2:3)ans =95   100>> student(2).nameans ='Ann Lane'

3.4 提取结构体中的值

结构体数组的拼接也很简单,和其它类型的拼接是一样的

  • 水平拼接

待拼接的结构体数组的行数相等。

  • 垂直拼接

待拼接的结构体数组的列数相等。

3.5 结构体功能函数

MATLAB 中文文档:结构体常用函数

命令描述
struct创建结构体数组
fieldnames结构体的字段名称,或者 JavaMicrosoft COM 对象的公共字段
getfield结构体数组字段
isfield确定输入是否为结构体数组字段
isstruct确定输入是否为结构体数组字段
orderfields结构体数组的顺序字段
rmfield删除结构体中的字段
setfield为结构体数组字段赋值
arrayfun将函数应用于每个数组元素
structfun对标量结构体的每个字段应用函数
table2struct将表转换为结构体数组
struct2table将结构体数组转换为表
cell2struct将元胞数组转换为结构体数组
cell2struct将结构体转换为元胞数组

3.6 嵌套结构体

>> A = struct('data', [3 4 7; 8 0 1], ...'nest', struct('testnum', 'Test 1', ...'xdata', [4 2 8], ...'ydata', [7 1 6]));
A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = 'Test 2';
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];
>> A.nestans = 包含以下字段的 struct:testnum: 'Test 1'xdata: [4 2 8]ydata: [7 1 6]ans = 包含以下字段的 struct:testnum: 'Test 2'xdata: [3 4 2]ydata: [5 0 9]>>  A(1)ans = 包含以下字段的 struct:data: [2×3 double]nest: [1×1 struct]>> A(1).dataans =3     4     78     0     1>> A(1).nestans = 包含以下字段的 struct:testnum: 'Test 1'xdata: [4 2 8]ydata: [7 1 6]>> AA = 包含以下字段的 1×2 struct 数组:datanest

4. 元胞数组(Cell)

MATLAB 官方文档:元胞数组

  • MATLAB 中,元胞数组是一个可以容纳不同类型元素的数据结构,类似于矩阵,但每个条目包含不同类型的数据。
  • 通过将索引括在圆括号 () 中可以引用元胞集。使用花括号 {} 进行索引来访问元胞的内容
  • 元胞数组包含其他数组的副本,而不包含指向这些数组的指针。如果随后更改 元胞数组,原数组不会发生变化。
  • 元胞数组可用于存储不同大小的矩阵序列

3.1 基本使用

  • 使用元胞数组构造运算符 {} 创建元胞数组

定义方式 1

>> A(1,1)={[1 4 3; 0 5 8; 7 2 9]};
A(1,2)={'Anne Smith'};
A(2,1)={3+7i};
A(2,2)={-pi:pi:pi};
>> AA =2×2 cell 数组{3×3 double        }    {'Anne Smith'      }{[3.0000 + 7.0000i]}    {[-3.1416 0 3.1416]}

定义方式 2

>> A{1,1}=[1 4 3; 0 5 8; 7 2 9];
A{1,2}='Anne Smith';
A{2,1}=3+7i;
A{2,2}=-pi:pi:pi;
>> AA =2×2 cell 数组{3×3 double        }    {'Anne Smith'      }{[3.0000 + 7.0000i]}    {[-3.1416 0 3.1416]}

定义方式 3

>> A = { [1 4 3; 0 5 8; 7 2 9]		'Anne Smith' ;...
3+7i		-pi:pi:pi}A =2×2 cell 数组{3×3 double        }    {'Anne Smith'      }{[3.0000 + 7.0000i]}    {[-3.1416 0 3.1416]}

上面三种方式是等价的,其中第二种方式使用单元索引赋值,而第三种方式使用内容索引赋值.

元胞数组的原理

  • 单元格数组中的每个条目都持有一个指向数据结构的指针
  • 同一单元阵列的不同单元可以指向不同类型的数据结构

元胞数组的访问

MATLAB :访问元胞数组中的数据

有两种方式访问元胞数组中的数据,分别是: 单元索引()和内容索引{}.

因为元胞数组的子集仍为元胞数组,在索引器内容的使用,我们有必要指明要访问的的是一个子元胞数组还是元胞数组对应区域中的内容.

  • 使用单元索引(),我们得到的是一个子元胞数组.
  • 使用内容索引{},我们得到的是元胞数组对应区域中的内容.
>> A(1,1)={[1 4 3; 0 5 8; 7 2 9]};
A(1,2)={'Anne Smith'};
A(2,1)={3+7i};
A(2,2)={-pi:pi:pi};
>> AA =2×2 cell 数组{3×3 double        }    {'Anne Smith'      }{[3.0000 + 7.0000i]}    {[-3.1416 0 3.1416]}>> B=A{1,1}B =1     4     30     5     87     2     9>> C=A(1,1)C =1×1 cell 数组{3×3 double}>> D=A{1,1}(6)D =2>> D=A{1,1}(3,2)D =2>> [r1c1, r2c1, r1c2, r2c2] = A{1:2,1:2}r1c1 =1     4     30     5     87     2     9r2c1 =3.0000 + 7.0000ir1c2 ='Anne Smith'r2c2 =-3.1416         0    3.1416

3.2 常用功能函数

MATLAB 官方文档:元胞数组常用函数

函数说明
cell创建一个元胞数组
cell2mat将元胞数组转换为基础数据类型的普通数组
cell2struct将元胞数组转换为结构体数组
celldisp显示元胞数组的内容
cellfun对元胞数组中的每个元胞应用函数
cellplot以图形方式显示元胞数组的结构体
cellstr转换为字符向量元胞数组
iscell确定输入是否为元胞数组
mat2cell将数组转换为在元胞中包含子数组的元胞数组
num2cell将数组转换为相同大小的元胞数组
struct2cell将结构体转换为元胞数组

num2cell 与 mat2cell 操作实例:

>> a = magic(3)a =8     1     63     5     74     9     2>> b = num2cell(a)b =3×3 cell 数组{[8]}    {[1]}    {[6]}{[3]}    {[5]}    {[7]}{[4]}    {[9]}    {[2]}>> c = mat2cell(a, [1 1 1], 3)c =3×1 cell 数组{1×3 double}{1×3 double}{1×3 double}

3.3 高维元胞数组

一个三维的元胞数组可以有行(row),列(column),层(layer)三个维度.在对元胞数组进行索引时,优先级从高到低的顺序分别是: 行→列→层.

cat 函数可以在指定维度上对元胞数组进行拼接.

reshape 返回具有指定的行和列的新数组

>> A = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)}
C = reshape(A,1,4)A =2×2 cell 数组{'James Bond'}    {3×2 double}{[    3.1416]}    {5×5 double}C =1×4 cell 数组列 13{'James Bond'}    {[3.1416]}    {3×2 double}4{5×5 double}

使用 reshape 从下面的矩阵a中创建一个矩阵B:

A =1     2     34     5     6>> B=reshape(A,3,2)B =1     54     32     6

5.判断变量数据类型的函数

MATLAB 官方文档:数据类型标识

函数描述
isinteger判断输入参数是否为整型数数组
islogical判断输入参数是否为逻辑量数组
isnumeric判断输入参数是否为数值数组
isreal判断输入参数是否为实数数组
ischar判断输入参数是否为字符数组
iscell判断输入参数是否为元胞数组
isfloat判断输入数组是否为浮点数组
ishandle判断输入数组是否有效的图形句柄
isempty判断输入数组是否为空
isprime确定哪些数组元素为质数
isnan确定哪些数组元素为NaN
isinf确定哪些数组元素为Inf
isequal判断数组是否相等

6. 文件访问(File Access)

MATLAB 官方文档:数据导入和导出
在这里插入图片描述
MATLAB 支持的文件格式:

文件内容扩展名读取文件的函数写入文件的函数
MATLAB格式化数据*.matloadsave
文本*.txtloadsave
电子表格*.xls,*.xlsxxlsreadxlswrite

6.1 读写MATLAB格式的数据:

MATLAB工作区内的数据以 *.mat 格式保存在文件中。

  • save 函数的语法如下:
    • save(filename,variables) 将变量 variables 以二进制形式存入文件中.
    • save(filename,variables,'-ascii') 将变量 variables 以文本形式存入文件中.
  • load 函数的语法如下:
    • load(filename) 从二进制形式文件中读取数据.
    • load(filename,'-ascii') 从文本形式文件中读取数据.

6.2 读写 Excel 表格

  • 读取语法: [num,txt,raw] = xlsread(filename,sheet,xlRange)
>> Score = xlsread('04Score.xlsx')Score =94    83    8976    88    8268    72    75>> Score = xlsread('04Score.xlsx', 'B2:D4')Score =94    83    8976    88    8268    72    75
  • 写入语法: xlswrite(filename,A,sheet,xlRange)
>> M = mean(Score)';
xlswrite('04Score.xlsx', M, 1, 'E2:E4');
xlswrite('04Score.xlsx', {'Mean'}, 1, 'E1');

6.3 文本文件读写

低级文件I/O功能:

函数说明
fopen打开文件,或获取打开文件的信息
fclose关闭一个或所有打开的文件
fscanf从文本文件读取数据
fprintf将数据写入文本文件
feof测试文件尾

打开和关闭文件:

将正弦值写入文件:

通过格式化I/O进行和写入:

从文件读取:

Reference

[1] MATLAB官方文档

[2] MATLAB03:数据类型与文件读写

[3] MATLAB(三)变数(变量)与档案存取


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部