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文件同名)可以被其他文件的函数调用,但其他子函数不能
- 间接调用:使用函数句柄,创建函数句柄需要使用到操作符@。创建格式为:
matlab
Function_Handle = @Function_FileName;
其中Function_Handle变量保存了这个函数句柄,Function_FileName变量是函数所对应的m文件名称或者是MATLAB内部函数的名称。如:
matlab
F_Handle = @cos;
x = 0:0.25 * pi : 2 * pi;
F_Handle(x)
结果为:
>> learn_Matlab
ans =
1.0000 0.7071 0.0000 -0.7071 -1.0000 -0.7071 -0.0000 0.7071 1.0000
结构体
MATLAB中的结构体和C语言中的结构体类似。创建结构体的方式有两种:
- 通过字段赋值创建:
例如:
matlab
Student.Name = 'Sam';
Student.Grade = '6';
Student.Subject = {'Chinese', 'Math', 'English'};
Student.Result = {99,99,99};
Student
运行结果:
>> learn_Matlab
Student =
包含以下字段的 struct:
Name: 'Sam'
Grade: '6'
Subject: {'Chinese' 'Math' 'English'}
Result: {[99] [99] [99]}
- 通过struct函数创建:
例如:
matlab
Schedule = struct('Day','Thu','Time','15:00','Number','18')
运行结果:
>> learn_Matlab
Schedule =
包含以下字段的 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矩阵的内容决定。
如:
matlab
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 =
包含以下字段的 struct
Day: 'Thu'
Time: '15:00'
Number: '18'
ans =
包含以下字段的 struct:
Day: 'Thu'
Time: '15:00'
Number: '18'
结构体数组:
matlab
newArray = struct('Day', {'Thu', 'Fri'}, 'Time', {'15:00', '13:00'}, 'Number', {12, 2})
newArrary(1)
newArrary(2)
运行结果:
>> learn_Matlab
newArray =
包含以下字段的 1×2 struct 数组:
Day
Time
Number
ans =
包含以下字段的 struct:
Day: 'Thu'
Time: '15:00'
Number: 12
ans =
包含以下字段的 struct:
Day: 'Fri'
Time: '13:00'
Number: 2
数组类型
在MATLAB中,进行运算的所有数据类型,都是按照数组及矩阵的形式进行存储和运算的,而两者的运算方式完全不同,数组强调的是元素对元素,而矩阵是用线性代数的运算方式。
数组的定义是广义的,数组的元素可以是任何数据类型。利用数组的构建方法可以直接对变量进行赋值:
matlab
array = [1 2 3 4 5]
运行结果:
>> learn_Matlab
array =
1 2 3 4 5
也可以使用冒号":"来代表一系列的值:
matlab
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
运行结果:
空数组的创建:
matlab
array = []
运行结果:
>> learn_Matlab
array =
[]
单元(cell)数组
使用单元数组的目的在于:它可以把不同类型数据归并到一个数组中。单元数组的维数不受限制。
- 使用赋值语句创建单元数组:
与一般数组有所不同的是,单元数组使用花括号"{}"来创建,使用逗号","或空格来分隔每一个单元,使用分号":"来分行。
matlab
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 Attributes
C 2x2 490 cell
- 利用cell函数创建空单元数组:
matlab
%创建一个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列单元中的内容,返回的是单元中的值。例如:
matlab
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 =
logical
0
ans =
'logical'
1. 单元数组的合并
matlab
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. 删除单元数组中指定的单元
只需要将空矩阵复制给指定的单元即可。
matlab
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函数的调用格式:
matlab
teimC = reshape(C, m, n)
%该函数将单元数组C改变为一个具有m行n列的新单元数组。
例如:
matlab
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对象
matlab
mapObj = containers.Map({key1,key2,......}, {value1, value2,......})
%当键和值是字符串时,需要稍做变更
mapObj = containers.Map({'key1', 'key2',......}, {'value1', 'value2',......})
例如:
matlab
scheduleMap = containers.Map({'Mon', 'Tue', 'Wed', 'Thu', 'Fri'}, {'Maths', 'Chinese', 'History', 'Geography', 'Biology'})
运行结果:
>> learn_Matlab
scheduleMap =
Map - 属性:
Count: 5
KeyType: char
ValueType: char
可以使用MapName.property来访问Map的属性,如:
matlab
scheduleMap.KeyType
运行结果:
ans =
'char'
也可以先创建一个空的Map,再通过键值对的对应来补充其内容。
- 读取Map对象
可以通过keys()函数来查看所有的key,也可以通过values()函数来查看所有的值。
如:
matlab
keys(scheduleMap)
values(scheduleMap)
运行结果:
ans =
1×5 cell 数组
{'Fri'} {'Mon'} {'Thu'} {'Tue'} {'Wed'}
ans =
1×5 cell 数组
{'Biology'} {'Maths'} {'Geography'} {'Chinese'} {'History'}
读取格式如下:
matlab
valueName = mapName(keyName)
%当键名是一个字符串时,需要使用单引号将键名括起来
例子:
matlab
course = scheduleMap('Wed')
输出为:
course =
'History'
如果需要对多个键进行访问时,可以使用values函数:
matlab
values(scheduleMap,{'Mon', 'Thu'})
输出为:
ans =
1×2 cell 数组
{'Maths'} {'Geography'}
- 编辑Map对象
从map中是删除键值对:
matlab
%使用remove函数的格式:
remove('mapName', 'keyName')
例如:
matlab
scheduleMap = containers.Map({'Mon', 'Tue', 'Wed', 'Thu', 'Fri'}, {'Maths', 'Chinese', 'History', 'Geography', 'Biology'})
remove(scheduleMap, 'Thu')
keys(scheduleMap)
values(scheduleMap)
输出为:
ans =
Map - 属性:
Count: 4
KeyType: char
ValueType: char
ans =
1×4 cell 数组
{'Fri'} {'Mon'} {'Tue'} {'Wed'}
ans =
1×4 cell 数组
{'Biology'} {'Maths'} {'Chinese'} {'History'}
添加键值对:
需要注意的是:原Map对象里的key是什么类型的,新添加的key就得是什么类型的。
matlab
%调用格式为
existingMapObj(newKeyName) = newValue
例如:
matlab
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:通过复制操作覆盖原有的值。