参考书:《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。
2.MATLAB数据结构
2.1 MATLAB向量
- 数组 ( A r r a y ) ({\rm Array}) (Array): M A T L A B {\rm MATLAB} MATLAB中数组可以是一维数组、二维数组或多维数组,这些数组可以包含数字、字符串、逻辑值等各种类型的数据;
- 向量是特殊的一维数组,矩阵是特殊的二维数组,无论是数字、文本还是其他数据类型,在 M A T L A B {\rm MATLAB} MATLAB中以数组的形式存储和处理;
- 几个向量的概念:
- 维度:向量的维度表示它所包含的元素数量,一维向量通常用于表示一列或一行数据;
- 元素:向量中每个单独数据元素称为向量的"分量"或"元素",元素可以是数字、文本、逻辑值等各种数据类型;
- 索引:向量中每个元素都有一个唯一的索引,用于标识它的位置;
- 表示:向量可以表示为行向量或列向量;
matlab
% ch02_01.m
% 向量相关操作:
%% 1.创建向量
% 1.1 创建行向量时使用中括号[]将元素括起来,在中间用空格或逗号(,)分隔每个元素;
% 1.2 创建列向量时使用中括号[]将元素括起来,在中间使用分号(;)分隔每个元素;
row_vector1 = [10, 20, 30, 40, 50]; % 创建一个行向量,逗号分隔;
row_vector2 = [10 20 30 40 50]; % 创建一个行向量,空格分隔;
column_vector1 = [10;20;30;40;50]; % 创建一个列向量,分号分隔;
row_vector1,row_vector2,column_vector1
%% 2.访问向量的单个元素
% 2.1 MATLAB中向量的单个元素,使用括号()和相应的索引进行访问;
% 2.2 MATLAB中向量的索引从1开始;
row_vector3 = [10, 20, 30, 40, 50]; % 创建一个行向量,逗号分隔;
column_vector2 = [10;20;30;40;50]; % 创建一个列向量,分号分隔;
element1 = row_vector3(1); % 访问行向量第一个元素10;
element2 = row_vector3(4); % 访问行向量第四个元素40;
element3 = column_vector2(1); % 访问列向量第一个元素10;
element4 = column_vector2(3); % 访问列向量第三个元素30;
element1,element2,element3,element4
%% 3.访问向量的多个元素
% 3.1 MATLAB中访问向量的多个元素,使用括号()和冒号:指定范围或索引;
% 3.2 语法格式:subset = vector(start_index:end_index);
% 3.3 start_index:起始索引;end_index:结束索引;包括起始索引和结束索引;
% 3.4 指定其中步长,默认步长为1;
% 3.5 语法格式:subset = vector(start_index:step:end_index);
row_vector4 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
subset1 = row_vector4(1:5); % 访问行向量第一到第五的元素,步长1;
subset2 = row_vector4(1:2:9); % 访问行向量第一到第九的元素,步长2;
subset3 = row_vector4(1:3:9); % 访问行向量第一到第九的元素,步长3;
subset1,subset2,subset3
matlab
% ch02_01.m结果:
row_vector1 =
10 20 30 40 50
row_vector2 =
10 20 30 40 50
column_vector1 =
10
20
30
40
50
element1 =
10
element2 =
40
element3 =
10
element4 =
30
subset1 =
1 2 3 4 5
subset2 =
1 3 5 7 9
subset3 =
1 4 7
2.2 MATLAB矩阵
- 矩阵 ( M a t r i x ) ({\rm Matrix}) (Matrix):矩阵是二维数组的一种特殊形式,用于存储一系列数字数据;
- 矩阵表示方法:一个 m × n {m\times{n}} m×n的矩阵表示有 m m m行和 n n n列, m 、 n m、n m、n均是正整数;
- 元素:矩阵的每个位置都包含一个数值,这些数值称为矩阵的元素,矩阵的元素可以是实数、复数、符号、表达式等;
- 矩阵维度:矩阵的维度由行数和列数决定;
- 特殊的矩阵:单位矩阵、对角矩阵、对称矩阵等;
matlab
% ch02_02.m
% 矩阵相关操作:
%% 1.创建矩阵
% 1.1 MATLAB中,在每行输入元素创建矩阵,元素间用逗号或空格分隔,
% 使用分号进行行分隔;
% 创建一个3x3矩阵
matrix1 = [1, 2, 3;
4, 5, 6;
7, 8, 9];
matrix1
%% 2.使用内置函数创建矩阵
matrix2 = zeros(4,4); % 创建一个4x4全0矩阵;
matrix3 = ones(4, 4); % 创建一个4x4全1矩阵;
matrix4 = eye(4); % 创建一个4x4单位矩阵;
matrix2,matrix3,matrix4
%% 3.访问矩阵的单个元素
% 使用括号()和相应的行列索引对矩阵中的单个元素访问
% 创建一个3x3矩阵
matrix5 = [1, 2, 3;
4, 5, 6;
7, 8, 9];
element1 = matrix5(1,1); % 值1;
element2 = matrix5(1,2); % 值2;
element3 = matrix5(2,2); % 值5;
element4 = matrix5(3,3); % 值9;
element1,element2,element3,element4
%% 4.访问矩阵的多个元素
% 使用()和冒号对矩阵中多个元素访问
% 创建一个3x3矩阵
matrix6 = [1, 2, 3;
4, 5, 6;
7, 8, 9];
subset1 = matrix6(1, 1:3); % 第1行,第1至3列的值;
subset2 = matrix6(1:3, 1); % 第1列,第1至3行的值;
subset3 = matrix6(1:2, 1:2); % 第1至2行,第1至2列的值;
subset4 = matrix6(:,:); % 全部元素;
subset1,subset2,subset3,subset4
matlab
% ch02_02.m结果:
% 1.创建矩阵;
matrix1 =
1 2 3
4 5 6
7 8 9
% 2.使用内置函数创建矩阵;
matrix2 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
matrix3 =
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
matrix4 =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
% 3.访问矩阵中单个元素;
element1 =
1
element2 =
2
element3 =
5
element4 =
9
% 4.访问矩阵中的多个元素;
subset1 =
1 2 3
subset2 =
1
4
7
subset3 =
1 2
4 5
subset4 =
1 2 3
4 5 6
7 8 9
2.3 MATLAB多维数组
- 多维数组 ( M u l t i d i m e n s i o n a l A r r a y s ) ({\rm Multidimensional\ Arrays}) (Multidimensional Arrays):多维数组是二维矩阵的扩展,可以包含更多的维度;
- 多维数组有多个维度,三维数组具有行、列和深度三个维度,四维数组具有更高的维度;
matlab
% ch02_03.m
% 多维数组相关操作:
clc;
clear;
%% 1.手动创建一个3x3x3(行x列x深度)的三维数组;
dimensional_array1(:,:,1)=[1, 2, 3;4, 5, 6;7, 8, 9];
dimensional_array1(:,:,2)=[10, 20, 30;40, 50, 60;70, 80, 90];
dimensional_array1(:,:,3)=[100, 200, 300;400, 500, 600;700, 800, 900];
dimensional_array1
%% 2.使用内置函数创建一个3x3x2的三维数组;
dimensional_array2 = ones(3, 3, 2);
dimensional_array3 = zeros(3, 3, 2);
dimensional_array4 = rand(3, 3, 2);
dimensional_array2,dimensional_array3,dimensional_array4
%% 3.reshape创建一个3x2x2的三维数组,读取一维二维数组一列一列从上往下读取;
array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
array2 = [1, 2, 3, 4, 5, 6; 7, 8, 9, 10, 11, 12];
array1,array2
dimensional_array5 = reshape(array1, [3, 2, 2]);
dimensional_array6 = reshape(array2, [3, 2, 2]);
dimensional_array5,dimensional_array6
%% 4.访问三维数组元素,使用括号()和逗号,访问指定索引的元素;
% 创建一个3x3x3(行x列x深度)的三维数组;
% 第一页元素;
dimensional_array7(:,:,1)=[1, 2, 3;4, 5, 6;7, 8, 9];
% 第二页元素;
dimensional_array7(:,:,2)=[10, 20, 30;40, 50, 60;70, 80, 90];
% 第三页元素;
dimensional_array7(:,:,3)=[100, 200, 300;400, 500, 600;700, 800, 900];
array_element1 = dimensional_array7(1, 1, 1); % 第1行第1列第1页元素1;
array_element2 = dimensional_array7(2, 2, 2); % 第2行第2列第2页元素50;
array_element3 = dimensional_array7(3, 3, 3); % 第3行第3列第3页元素900;
array_element4 = dimensional_array7(2, 2, 1); % 第2行第2列第1页元素5;
array_element1,array_element2,array_element3,array_element4
matlab
% ch02_03.m结果:
dimensional_array1(:,:,1) =
1 2 3
4 5 6
7 8 9
dimensional_array1(:,:,2) =
10 20 30
40 50 60
70 80 90
dimensional_array1(:,:,3) =
100 200 300
400 500 600
700 800 900
dimensional_array2(:,:,1) =
1 1 1
1 1 1
1 1 1
dimensional_array2(:,:,2) =
1 1 1
1 1 1
1 1 1
dimensional_array3(:,:,1) =
0 0 0
0 0 0
0 0 0
dimensional_array3(:,:,2) =
0 0 0
0 0 0
0 0 0
dimensional_array4(:,:,1) =
0.4018 0.1233 0.4173
0.0760 0.1839 0.0497
0.2399 0.2400 0.9027
dimensional_array4(:,:,2) =
0.9448 0.3377 0.1112
0.4909 0.9001 0.7803
0.4893 0.3692 0.3897
array1 =
1 2 3 4 5 6 7 8 9 10 11 12
array2 =
1 2 3 4 5 6
7 8 9 10 11 12
dimensional_array5(:,:,1) =
1 4
2 5
3 6
dimensional_array5(:,:,2) =
7 10
8 11
9 12
dimensional_array6(:,:,1) =
1 8
7 3
2 9
dimensional_array6(:,:,2) =
4 11
10 6
5 12
array_element1 =
1
array_element2 =
50
array_element3 =
900
array_element4 =
5
2.4 MATLAB元胞数组
- 元胞数组 ( C e l l A r r a y s ) ({\rm Cell\ Arrays}) (Cell Arrays)可以容纳不同类型的数据和大小不同的数组;
- 元胞数组中的元素称为"元胞",每个元胞可以存储不同的数据类型,包括数值、文本、函数句柄等;
- 元胞数组通常用于处理混合数据或具有不规则结构的数据;
matlab
% ch02_04.m
% 元胞数组相关操作:
clc;
clear;
%% 1.创建元胞数组
% 使用大括号{}创建元胞数组,每个元胞可以包含任何类型的数据;
cellArray1 = {1, 3.14, 'Willard', [1, 2, 3, 4]};
cellArray2 = {'Willard', 'Chen', 'Jin', 'FUXI'};
cellArray1,cellArray2
%% 2.访问元胞数组
% 2.1 使用大括号{}或小括号()通过索引访问元胞数组的元素;
% 2.2 ()用于访问元胞元素内部的数组元素;
% 2.3 {}用于访问整个元胞;
% 创建一个2行3列的元胞数组;
cellArray3 = {8, 'Willard', [5, 8, 4;5, 2, 0]; 6, 'Chen', logical([1 0])};
% 使用{}访问整个元胞元素;
cellElement1 = cellArray3{1}; % 访问第1个元胞元素,值8
cellElement2 = cellArray3{2}; % 访问第2个元胞元素,值6
cellElement3 = cellArray3{3}; % 访问第3个元胞元素,字符串'Willard'
cellElement4 = cellArray3{1, 1}; % 访问第1行第1列元胞,值8
cellElement5 = cellArray3{1, 3}; % 访问第1行第3列元胞,二维数组
cellElement6 = cellArray3{2, 2}; % 访问第2行第2列元胞,字符串'Chen'
cellElement1,cellElement2,cellElement3
cellElement4,cellElement5,cellElement6
% 使用()访问元胞元素中的数组元素;
cellElement7 = cellArray3{3}; % 访问第3个元胞元素,字符串'Willard'
cellElement8 = cellArray3{3}(1, 1); % 访问第3个元胞元素第1行第1列的元素,值'W'
cellElement9 = cellArray3{5}(1, :); % 访问第5个元胞元素第1行元素,5 8 4
cellElement7,cellElement8,cellElement9
matlab
% ch02_04.m结果:
cellArray1 =
1×4 cell 数组
{[1]} {[3.1400]} {'Willard'} {1×4 double}
cellArray2 =
1×4 cell 数组
{'Willard'} {'Chen'} {'Jin'} {'FUXI'}
cellElement1 =
8
cellElement2 =
6
cellElement3 =
'Willard'
cellElement4 =
8
cellElement5 =
5 8 4
5 2 0
cellElement6 =
'Chen'
cellElement7 =
'Willard'
cellElement8 =
'W'
cellElement9 =
5 8 4
2.5 MATLAB字符串
matlab
% ch02_05.m
clc;
clear;
% 字符串:一种用于存储文本数据的数据类型;
% 字符串相关操作:
%% 1.创建字符串
% MATLAB中,使用双引号""或单引号''创建字符串;
str1 = "Hello.My name is Willard."; % 双引号创建字符串;
str2 = 'Welcome to FUXI AI Technology.'; % 单引号创建字符串;
str1,str2
%% 2.字符串拼接
% MATLAB中,使用加号+连接两个字符串;
str3 = "Hello";
str4 = "ChenJD.";
str34 = str3 + " " + str4;
str34
%% 3.字符串长度
% MATLAB中,使用strlength函数获取字符串长度;
str5 = "Hello.My name is Willard."; % 双引号创建字符串;
str6 = 'Welcome to FUXI AI Technology.'; % 单引号创建字符串;
str5_length = strlength(str5);
str6_length = strlength(str6);
str5_length,str6_length
%% 4.字符串分割
% MATLAB中,使用strsplit函数将字符串拆分为字符串数组,使用分隔符指定拆分位置;
str7 = "GuangZhou ShenZhen Zhanjiang";
str8 = 'Math,Chinese,History.';
str7Array = strsplit(str7, ' '); % 使用空格拆分字符串;
str8Array = strsplit(str8, ','); % 使用逗号拆分字符串;
str7Array,str8Array
%% 5.字符串查找
% MATLAB中,使用strfind函数查找子字符串在主字符串中的位置;
str9 = "Welcome to FUXI AI Technology.";
subString1 = "Welcome";
subString2 = "FUXI";
sub_str_index1 = strfind(str9, subString1);
sub_str_index2 = strfind(str9, subString2);
sub_str_index1,sub_str_index2
%% 6.字符串替换
% MATLAB中,使用replace函数将字符串中的指定子字符串替换为新的子字符串;
str10 = "My name is Willard.";
replaceStr = replace(str10, 'Willard', 'ChenJD');
replaceStr
%% 7.字符串大小写转换
% MATLAB中,使用lower和upper函数将字符串转换为小写或大写;
str11 = "FUXI";
str12 = "fuxi";
lowerStr = lower(str11);
upperStr = upper(str12);
lowerStr,upperStr
%% 8.字符串格式化
% 语法格式:
% formattedStr = sprintf(format, arg1, arg2, ...);
% format:格式字符串,指定最终输出字符串的格式;
% arg1,arg2,...:要插入格式字符串中的数据或变量;
name = "Willard";
class = "Class Four";
math_score = 100;
Chinese_score = 99;
formattedStr1 = sprintf("Name:%s,class:%s",name,class);
formattedStr2 = sprintf("math_score:%d,Chinese_score:%d",math_score,Chinese_score);
formattedStr1,formattedStr2
matlab
% ch02_05.m结果:
str1 =
"Hello.My name is Willard."
str2 =
'Welcome to FUXI AI Technology.'
str34 =
"Hello ChenJD."
str5_length =
25
str6_length =
30
str7Array =
1×3 string 数组
"GuangZhou" "ShenZhen" "Zhanjiang"
str8Array =
1×3 cell 数组
{'Math'} {'Chinese'} {'History.'}
sub_str_index1 =
1
sub_str_index2 =
12
replaceStr =
"My name is ChenJD."
lowerStr =
"fuxi"
upperStr =
"FUXI"
formattedStr1 =
"Name:Willard,class:Class Four"
formattedStr2 =
"math_score:100,Chinese_score:99"
2.6 MATLAB结构体
- M A T L A B {\rm MATLAB} MATLAB中,结构体是用于组织和存储不同类型的数据的数据类型;
- 结构体将相关数据项组合在一起,并为每个数据项分配一个字段名称,便于访问和管理数据;
matlab
% ch02_06.m
clc;
clear;
% 结构体的相关操作;
%% 1.创建结构体示例:
% 示例1:学生基本信息
studentInfo.name = "Willard";
studentInfo.age = 18;
studentInfo.class = "Class Four";
studentInfo.gender = "male";
studentInfo
% 示例2:学生各科成绩
studentScore.math = 100;
studentScore.Chinese = 95;
studentScore.physics = 98;
studentScore.chemistry = 99;
studentScore
%% 2.访问结构体字段
% 使用点运算符.对结构体字段进行访问;
stuName = studentInfo.name;
stuAge = studentInfo.age;
stuScore1 = studentScore.math;
stuScore2 = studentScore.Chinese;
stuName,stuAge,stuScore1,stuScore2
%% 3.修改结构体字段值
studentInfo.name = "ChenJD";
studentInfo.gender = "female";
studentInfo
studentScore.Chinese = 100;
studentScore.physics = 99;
studentScore
%% 4.结构体数组
studentInfomation(1).name = "Luo";
studentInfomation(1).age = 20;
studentInfomation(2).name = "Chen";
studentInfomation(2).age = 18;
studentInfomation
matlab
% ch02_06.m结果:
studentInfo =
包含以下字段的 struct:
name: "Willard"
age: 18
class: "Class Four"
gender: "male"
studentScore =
包含以下字段的 struct:
math: 100
Chinese: 95
physics: 98
chemistry: 99
stuName =
"Willard"
stuAge =
18
stuScore1 =
100
stuScore2 =
95
studentInfo =
包含以下字段的 struct:
name: "ChenJD"
age: 18
class: "Class Four"
gender: "female"
studentScore =
包含以下字段的 struct:
math: 100
Chinese: 100
physics: 99
chemistry: 99
studentInfomation =
包含以下字段的 1×2 struct 数组:
name
age
2.7 MATLAB表
-
M A T L A B {\rm MATLAB} MATLAB中,表用于组织和存储二维数据的一种数据结构;
-
表的每一列可以包含不同类型的数据,每一列都有一个名称;
-
表示例:
N a m e {\rm Name} Name A g e {\rm Age} Age H e i g h t {\rm Height} Height w e i g h t {\rm weight} weight W i l l a r d {\rm Willard} Willard 20 20 20 173 173 173 65 65 65 C h e n J D {\rm ChenJD} ChenJD 18 18 18 165 165 165 48 48 48 Z h a n g {\rm Zhang} Zhang 18 18 18 166 166 166 46 46 46
matlab
% ch02_07.m
clc;
clear;
% 表的相关操作;
%% 1.创建表
% MATLAB中,使用table函数创建表,创建表格时,指定列的名称及每列的数据;
studentsInfo = table(...
{'Willard';'ChenJD';'Zhang'},...
[20; 18; 18],...
[173; 165; 166],...
[65; 48; 46],...
'VariableNames', {'Name', 'Age', 'Height', 'Weight'}); % 指定表格列名;
studentsInfo
%% 2.访问表数据
% 使用列名称访问表数据
stuNames = studentsInfo.Name; % 访问学生姓名列;
stuAges = studentsInfo.Age; % 访问学生年龄列;
stuHeights = studentsInfo.Height; % 访问学生身高列;
stuWeights = studentsInfo.Weight; % 访问学生体重列;
stuNames,stuAges,stuHeights,stuWeights
% 使用索引访问表数据
column1 = studentsInfo{:,1}; % 访问所有行的第1列数据;
column2 = studentsInfo{:,2}; % 访问所有行的第2列数据;
column3 = studentsInfo{:,3}; % 访问所有行的第3列数据;
column4 = studentsInfo{:,4}; % 访问所有行的第4列数据;
column1,column2,column3,column4
matlab
% ch02_07.m结果:
studentsInfo =
3×4 table
Name Age Height Weight
___________ ___ ______ ______
{'Willard'} 20 173 65
{'ChenJD' } 18 165 48
{'Zhang' } 18 166 46
stuNames =
3×1 cell 数组
{'Willard'}
{'ChenJD' }
{'Zhang' }
stuAges =
20
18
18
stuHeights =
173
165
166
stuWeights =
65
48
46
column1 =
3×1 cell 数组
{'Willard'}
{'ChenJD' }
{'Zhang' }
column2 =
20
18
18
column3 =
173
165
166
column4 =
65
48
46