MATLAB入门一基础知识
此篇为课程学习笔记
链接: link
什么是MATLAB
平时所说的MATLAB既是一款软件又是一种编程语言,只是这种高级解释性语言是在配套的软件下进行开发的
MATLAB的一个特性
MATLAB的一个特性,如果一条语句以英文分号‘;’结尾,那么这条语句对应的内容或者运行结果不会在命令窗口中被显示,如果没有分号‘;’则会被显示。
最常见的函数
内置输出函数disp(X)
disp函数是MATLAB的内置输出函数,直接调用它可以在命令窗口中输出你想输出的结果X。
X可以是各种各样的数据,包括数字、字符、矩阵等等。
内置输入函数input()
用于用户对程序内输入数据,具体用法为x = input(prompt)或者str = input(prompt,‘s’),前者表示输入一个数值,后者表示输入一个字符串。
当程序运行到这个地方时,在命令窗口内,需要用户输入一个数据,以回车键结束,那么这个数据会存储到x(如果使用的是字符型输入,则存储到str),其中,prompt表示提示语,一般是一个字符串,而且这个字符串必须有(可以为空字符串"")。
数字转字符函数num2str(A)
用于将数字A转换为字符串,根据这个函数的构造很容易看出它的意思“number to string”。
函数
在MATLAB中,对函数的调用方法分为直接调用和间接调用。
- 直接调用:一个M文件中只能有一个主函数,这个主函数(与m文件同名)可以被其他文件的函数调用,但其他子函数不能
- 间接调用:使用函数句柄,创建函数句柄需要使用到操作符@。创建格式为:
Function_Handle = @Function_FileName;
其中Function_Handle变量保存了这个函数句柄,Function_FileName变量是函数所对应的m文件名称或者是MATLAB内部函数的名称。如:
F_Handle = @cos;
x = 0:0.25 * pi : 2 * pi;
F_Handle(x)结果为:
>> learn_Matlabans =1.0000 0.7071 0.0000 -0.7071 -1.0000 -0.7071 -0.0000 0.7071 1.0000
结构体
MATLAB中的结构体和C语言中的结构体类似。创建结构体的方式有两种:
- 通过字段赋值创建:
例如:
Student.Name = 'Sam';
Student.Grade = '6';
Student.Subject = {'Chinese', 'Math', 'English'};
Student.Result = {99,99,99};
Student运行结果:
>> learn_MatlabStudent = 包含以下字段的 struct:Name: 'Sam'Grade: '6'Subject: {'Chinese' 'Math' 'English'}Result: {[99] [99] [99]}
- 通过struct函数创建:
例如:
Schedule = struct('Day','Thu','Time','15:00','Number','18')运行结果:
>> learn_MatlabSchedule = 包含以下字段的 struct:Day: 'Thu'Time: '15:00'Number: '18'
补充:repmat 函数定义
B = repmat(A,n)
B = repmat(A,r1,…,rN)
B = repmat(A,r)
这是一个处理矩阵内容有重复时使用,其功能是以A的内容堆叠在(r1xr2)的矩阵B中,B矩阵的大小由r1r2r3*…及A矩阵的内容决定。
如:
Schedule = struct('Day','Thu','Time','15:00','Number','18')
SS = repmat(Schedule,1,2);
SS(1)
SS(2)运行结果:>> learn_Matlab
Schedule = 包含以下字段的 struct:Day: 'Thu'Time: '15:00'Number: '18'
ans = 包含以下字段的 structDay: 'Thu'Time: '15:00'Number: '18'
ans = 包含以下字段的 struct:Day: 'Thu'Time: '15:00'Number: '18'
结构体数组:
newArray = struct('Day', {'Thu', 'Fri'}, 'Time', {'15:00', '13:00'}, 'Number', {12, 2})
newArrary(1)
newArrary(2)运行结果:
>> learn_Matlab
newArray = 包含以下字段的 1×2 struct 数组:DayTimeNumber
ans = 包含以下字段的 struct:Day: 'Thu'Time: '15:00'Number: 12
ans = 包含以下字段的 struct:Day: 'Fri'Time: '13:00'Number: 2
数组类型
在MATLAB中,进行运算的所有数据类型,都是按照数组及矩阵的形式进行存储和运算的,而两者的运算方式完全不同,数组强调的是元素对元素,而矩阵是用线性代数的运算方式。
数组的定义是广义的,数组的元素可以是任何数据类型。利用数组的构建方法可以直接对变量进行赋值:
array = [1 2 3 4 5]
运行结果:
>> learn_Matlab
array =1 2 3 4 5
也可以使用冒号”:“来代表一系列的值:
array = 0:10 % 表示从0开始,步长为1,到10结束的一系列数字序列;
% 序列最后一个数小于等于10
array1 = 0:2:9 % 表示从0开始,步长为2,到9结束的一系列数字序列;
% 序列最后一个数小于等于9>> learn_Matlab
array =0 1 2 3 4 5 6 7 8 9 10
array1 =0 2 4 6 8
运行结果:
空数组的创建:
array = []运行结果:
>> learn_Matlab
array =[]
单元(cell)数组
使用单元数组的目的在于:它可以把不同类型数据归并到一个数组中。单元数组的维数不受限制。
- 使用赋值语句创建单元数组:
与一般数组有所不同的是,单元数组使用花括号”{}“来创建,使用逗号”,“或空格来分隔每一个单元,使用分号”:“来分行。
C = {'x', [1;3;6]; 10, pi}
whos C运行结果:
>> learn_Matlab
C =2×2 cell 数组{'x' } {3×1 double}{[10]} {[ 3.1416]}Name Size Bytes Class AttributesC 2x2 490 cell
- 利用cell函数创建空单元数组:
%创建一个m*n的空单元数组,其中每一个单元均为空矩阵
cellName = cell(2, 3)
>> learn_Matlab
cellName =2×3 cell 数组{0×0 double} {0×0 double} {0×0 double}{0×0 double} {0×0 double} {0×0 double}
单元数组的寻访
在单元数组中,寻访单元和单元中的内容是不一样的,对应的是两种不同的操作。为此MATLAB设计了相对应的操作对象:单元外标识(cell indexing)和单元内编址(content Addressing).
对于单元数组C, **cell(m,n)**指的是单元数组中的第m行第n列的单元,它返回的是一个单元,**cell{m,n}**指的是单元数组中的第m行第n列单元中的内容,返回的是单元中的值。例如:
C = {2,[2 4;3 6;1 3], 'string'; sin(pi/8),3>10, 'code'}v1 = C(2, 2)class(v1)v2 = C{2, 2}class(v2)运行结果:
>> learn_Matlab
C =2×3 cell 数组{[ 2]} {3×2 double} {'string'}{[0.3827]} {[ 0]} {'code' }
v1 =1×1 cell 数组{[0]}
ans ='cell'
v2 =logical0
ans ='logical'
1. 单元数组的合并
a{1, 1} = 'cellclass';
a{1, 2} = [1 2 2];
a{2, 1} = ['q' 'w' 'e'];
a{2, 2} = [6 5 4];
a
b = {'Jan'}
c = {a, b}
2. 删除单元数组中指定的单元
只需要将空矩阵复制给指定的单元即可。
a{1, 1} = 'cellclass';
a{1, 2} = [1 2 2];
a{2, 1} = ['q' 'w' 'e'];
a{2, 2} = [6 5 4];a{2, 2} = []
a(1, 2) = {[]}运行结果:
>> learn_Matlab
a =2×2 cell 数组{'cellclass'} {1×3 double}{'qwe' } {0×0 double}
a =2×2 cell 数组{'cellclass'} {0×0 double}{'qwe' } {0×0 double}
3. 使用reshape函数改变单元数组的形状
reshape函数的调用格式:
teimC = reshape(C, m, n)
%该函数将单元数组C改变为一个具有m行n列的新单元数组。
例如:
C = {ones(3), 'hello,world', zeros(5), [21, 3, 2]}
newC = reshape(C,2,2)运行结果为:
>> learn_Matlab
C =1×4 cell 数组{3×3 double} {'hello,world'} {5×5 double} {1×3 double}
newC =2×2 cell 数组{3×3 double } {5×5 double}{'hello,world'} {1×3 double}
map容器类型
map的本意是映射,就是将一个量映射到另一个量,map中的内容是键值对,即一个key对应一个value。map中存储的数据可以是任何类型的。
- 创建map对象
mapObj = containers.Map({key1,key2,……}, {value1, value2,……})
%当键和值是字符串时,需要稍做变更
mapObj = containers.Map({'key1', 'key2',……}, {'value1', 'value2',……})
例如:
scheduleMap = containers.Map({'Mon', 'Tue', 'Wed', 'Thu', 'Fri'}, {'Maths', 'Chinese', 'History', 'Geography', 'Biology'})运行结果:
>> learn_MatlabscheduleMap = Map - 属性:Count: 5KeyType: charValueType: char
可以使用MapName.property来访问Map的属性,如:
scheduleMap.KeyType 运行结果:
ans ='char'
也可以先创建一个空的Map,再通过键值对的对应来补充其内容。
- 读取Map对象
可以通过keys()函数来查看所有的key,也可以通过values()函数来查看所有的值。
如:
keys(scheduleMap)
values(scheduleMap)运行结果:
ans =1×5 cell 数组{'Fri'} {'Mon'} {'Thu'} {'Tue'} {'Wed'}
ans =1×5 cell 数组{'Biology'} {'Maths'} {'Geography'} {'Chinese'} {'History'}
读取格式如下:
valueName = mapName(keyName)
%当键名是一个字符串时,需要使用单引号将键名括起来
例子:
course = scheduleMap('Wed')输出为:course ='History'
如果需要对多个键进行访问时,可以使用values函数:
values(scheduleMap,{'Mon', 'Thu'})输出为:
ans =1×2 cell 数组{'Maths'} {'Geography'}
- 编辑Map对象
从map中是删除键值对:
%使用remove函数的格式:
remove('mapName', 'keyName')
例如:
scheduleMap = containers.Map({'Mon', 'Tue', 'Wed', 'Thu', 'Fri'}, {'Maths', 'Chinese', 'History', 'Geography', 'Biology'})remove(scheduleMap, 'Thu')keys(scheduleMap)
values(scheduleMap)输出为:
ans = Map - 属性:Count: 4KeyType: charValueType: char
ans =1×4 cell 数组{'Fri'} {'Mon'} {'Tue'} {'Wed'}
ans =1×4 cell 数组{'Biology'} {'Maths'} {'Chinese'} {'History'}
添加键值对:
需要注意的是:原Map对象里的key是什么类型的,新添加的key就得是什么类型的。
%调用格式为
existingMapObj(newKeyName) = newValue
例如:
scheduleMap('Sta') = 'public'
keys(scheduleMap)
values(scheduleMap)输出为:
ans =1×6 cell 数组{'Fri'} {'Mon'} {'Sta'} {'Thu'} {'Tue'} {'Wed'}
ans =1×6 cell 数组{'Biology'} {'Maths'} {'public'} {'Geography'} {'Chinese'} {'History'}
修改key:
如果需要在保持值不变的情况下,对键名进行修改,则首先要删除键值对,然后再添加。
修改value:通过复制操作覆盖原有的值。