【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 | 单精度浮点数 |
int8 | 8位带符号整数 |
int16 | 16位带符号整数 |
int32 | 32位带符号整数 |
int64 | 64位带符号整数 |
uint8 | 8位无符号整数 |
uint16 | 16位无符号整数 |
uint32 | 32位无符号整数 |
uint64 | 64位无符号整数 |
类型转换:

2. 字符串类型(char)
2.1 字符数组
-
在
MATLAB中,字符串类型由一对单引号'包裹一段文字来定义.标准ASCII字符可以被转换为对应的ASCII码. ASCII 表 -
一个字符在
ASCll中使用0到255之间的数字代码表示
>> 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 | 结构体的字段名称,或者 Java 或 Microsoft 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 数组列 1 至 3{'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格式化数据 | *.mat | load | save |
| 文本 | *.txt | load | save |
| 电子表格 | *.xls,*.xlsx | xlsread | xlswrite |
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(三)变数(变量)与档案存取
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
