第一章 入门
写在前面:本文档原为《freexyn编程实例视频教程系列1:Matlab基础入门》课程文档,后经韩松岳同学悉心整理并添加程序和注释,形成本文,现全网免费发布,版权所有,仅供个人学习交流使用,其中不足之后,欢迎补充指正;若程序注释没有完全表达其含义,可对照视频学习。
1.1 认识软件
1.软件简介
Matlab是matrix和laboratory组合缩写,意为矩阵实验室
主要功能和用途:
用于科学和工程计算的高级语言;
用于调整运行环境进行迭代探索、设计和问题解决;
用于可视化数据的图形表达和用于创建自定义绘图的工具;
用于曲线拟合,数据分类,信号分析,控制系统调整等;
用于各种工程和科学应用的附加工具箱;
用于自定义用户界面构建应用程序;
用于接口C/C ++、JAVA、.NET、Python、SQL和Excel等;
2. 软件安装
软件安装过程略
3.认识界面
启动Matlab,默认的界面布局
Matlab默认界面
当前文件夹:访问文件的路径,也是工作目录
命令窗口:输入命令并运行,由提示符“>>”指示
工作区:显示创建或导入的数据或变量
历史命令窗口:记录命令窗口中执行过的命令
1.2 创建变量
1.在Matlab中创建和使用变量
2.认识命令
whos
clear
3.说明
Matlab中创建变量不需要声明,类型默认使用双精度浮点型
创建变量后在命令窗口立即显示结果,并在工作区添加该变量
当不指定输出变量时,默认使用ans存储计算结果
程序语句以分号结尾,执行运算后不显示输出结果
命令窗口中回车键起运行程序功能
若输入一条语句后换行,但不想立刻运行,用Shift+Enter
允许一行输入多个语句,用逗号或分号分隔每个语句
快速回调之前执行过的语句,可以用方向键的上键和下键
清除或者不执行当前语句,用Esc键退出
可以选中部分程序,然后按回车键直接运行这部分程序
创建数组或矩阵,用中括号把数值括起来
1.3 调用函数
1.几个常用函数,说明Matlab调用函数的方法
2.认识函数
求最大值max
正弦函数sin
显示字符disp
清除屏幕clc
3.说明
Matlab提供了很多函数方便直接调用,调用格式:
[out1,out2]=function(input1,input2)
调用时把输入参数括在括号内,有多个输入参数时,用逗号分隔
相应的,有多个输出值时,用逗号分隔,并用中括号括起来
4.命令语法和函数语法的对偶性
当不需要输出,且所有输入都是字符向量
以下两种语法是等效的:
functionName(input1,...,inputN) %函数语法
functionName input1 ... inputN %命令语法(缺点:参数必须是字符型,而不能是数值型)
1.4 脚本编程
1.使用脚本文件编程的方法
2.说明
2.1 概念
脚本文件是包含一系列的命令和函数的程序文件,扩展名是.m
当需要把多个程序语句组合起来完成一项总体运算和功能时,常用脚本文件,方便存储、管理和重用,是Matlab里普遍的编程方式
2.2 创建脚本的方法
%在当前工作目录右键-新建文件-脚本;
%菜单栏,“主页”-“新建脚本”。
%使用edit命令;
2.3 运行脚本的方法
要运行的脚本文件必须存储在当前工作目录或者搜索路径上
%在编辑器中点击运行按钮;
%快捷键F5;
%当前工作目录选中该脚本右键-运行。
%在命令窗口中输入文件名称回车运行;
1.5 语法高亮
1.Matlab显示不同程序元素的默认方式
2.说明
2.1 语法高亮
Matlab会把不同的程序字段用不同的颜色区分出来
关键字是蓝色的,如if
注释是绿色的,如%注释
字符向量是紫色的,如'adsaf'
未终结的字符向量是栗色的,如'ads
程序中无效字符是红色的
命令窗口输出时错误提示是红色的
2.2 使用注释
%在文本开头添加百分号%
%快捷键,选中文本按Ctrl+R,取消注释Ctrl+T
第二章 矩阵
1.6 创建矩阵
1.创建矩阵
2.认识创建方法
基本运算符 []
冒号运算符 :
用逗号或空格分隔同一行的元素
用分号或回车键分隔不同的行
创建序列linspace
3.说明
矩阵是一个二维的数据阵列
Matlab是一个基于矩阵的计算环境,最基本的的数据结构是矩阵
单个数值也存储为矩阵,在这种情况下,矩阵的大小为1乘1
再例如'Hello World'这样的字符元素是1×11的矩阵
也支持有两个以上维度的数据结构,即n维数组
4.实例演示
%1_6
[1 2 3] %空格分隔元素
[1,2,3] %逗号分隔元素
[1 2 3
4 5 6] %回车创建不同行
[1 2 3;4 5 6] %分号分隔不同行
1:5 %行向量: 1至5
1:4.5 %取整到4
4:1 %空的行向量(错误写法)
4:-1:1 %4至1行向量(正确写法)
2.5:0.3:3.2 %按0.3增长至边界值内
linspace(1,5,5) %参数分别为起点、终点和元素个数
linspace(1,5) %不指定元素个数,则默认100个元素
1.7 创建矩阵的函数
1.介绍一些创建矩阵的常用函数
2.认识函数
全0矩阵zeros
全1矩阵ones
单位矩阵eye
对角矩阵diag
魔方矩阵magic
随机矩阵rand
上三角矩阵triu
下三角矩阵tril
3.实例演示
%1_7
zeros(1,4) %1行4列全0矩阵
zeros(3,4) %3行4列全0矩阵
zeros(4) %4阶全0矩阵
ones(1,4) %1行4列全1矩阵
eye(3) %3阶单位矩阵
eye(2,3) %2行3列单位矩阵
magic(3) %3阶魔方矩阵
magic(30)
a=rand(1,4) %1行4列随机矩阵
b=rand(4) %4阶随机矩阵
diag(b) %提取对角线元素
diag(a) %a为向量,则将a元素扩展为n阶矩阵
triu(b) %提取上三角形元素
tril(b) %提取下三角形元素
tril(b,1) %添加偏移量参数,1正数往右上
tril(b,2)
tril(b,-1) %向左下偏移1,再取下三角元素
1.8 连接矩阵
1.矩阵的连接
2.认识连接方法
基本连接符[]
水平连接horzcat
垂直连接vertcat
平铺复制repmat
对角分块blkdiag
任意维度连接cat
3.说明
矩阵连接是通过连接一个或多个矩阵来创建一个新矩阵的过程
与创建类似,逗号或空格实现水平连接,分号实现垂直连接
连接后的矩阵要仍然保持矩形结构才能实现连接
也就是说,水平连接矩阵,每个矩阵必须具有相同的行数
垂直连接时,每个矩阵必须具有相同的列数
4.实例演示
%1_8
a=[1 2;3 4]
b=[5 6;7 8]
[a,b] %矩阵水平连接
[a;b] %垂直连接
horzcat(a,b) %水平连接函数
vertcat(a,b) %垂直连接函数
repmat(a,1,3) %平铺复制为1行3列矩阵
repmat(a,3,3)
blkdiag(a,b) %对角分块重组函数:将矩阵a和b整体分别视为对角线上元素进行重组
e=[1 2]
cat(1,e,e) %任意维度连接:维度、矩阵e、矩阵e。1维按列纵向连接
cat(2,e,e) %2维:横向连接
cat(3,e,e) %3维:页面方向(三位方向)
1.9 矩阵索引
1.矩阵的索引
2.认识函数
获取矩阵的行列数size
3.概念
一个矩阵里有多个元素,要想访问或修改其中的元素,使用索引
索引3种方式:
①组合索引A(i,j),也称下标索引
②线性索引A(i) ,按列优先的顺序依次向下索引
③逻辑索引,在逻辑为真的位置返回矩阵的元素
4.说明
组合索引和线性方式可以互换
访问多个元素或不连续的元素可以把索引写成矩阵的形式
逻辑索引的维度必须与矩阵的维度相同
索引超出矩阵范围的元素会报错
5.实例演示
%1_9
a=magic(3) %3阶魔方矩阵
a(2,3) %组合索引:索引第2行第3列元素(2个参数,用逗号分隔)
a(3) %线性索引:列优先索引(1个参数)
size(a) %获取矩阵行列维度
sub2ind([3,3],2,3) %组合索引转化为线性索引,三个输入参数为:矩阵维度、组合索引行位置、组合索引列位置
[row,col]=ind2sub(size(a),8) %线性索引转化为组合索引
% a(3,4) %超出范围报错(初学者常犯错误)
a(1,:) %冒号:表示任意行或任意列
a(:,1) %任意行的第1列
a(:,:)
a(1,2:3) %第1行,第2-3列
a(1,[1 3]) %第1行,第1列和第3列
a(1,end) %end表示最后一个:第1行最后1列
a([1 3]) %线性索引:矩阵a第1个和第3个元素
a([1 2;4 5]) %提取第1、2和第4、5个元素并分别放置在矩阵第1行和第2行
a(:) %按列优先转变为单个数字序列,返回一列值
b=[1 2;3 4]
c=[true false;true false] %逻辑数组结果用1/0表示
b(c) %逻辑索引:逻辑值为真返回对应元素,为假不返回
1.10 矩阵元素修改
1.矩阵元素的修改、添加和删除
2.说明
通过指定矩阵索引修改、添加或删除相应元素
索引超出矩阵范围的元素会报错,但可以赋值
删除元素后的矩阵仍然要保持矩形,否则报错
必要时,对超出矩阵范围的索引赋值需要预分配内存
3.实例演示
%1_10
a=[1 2 3;4 5 6;7 8 9]
a(2,2)=10
a(2)=10
a(3,4)=10 %超出矩阵范围索引会报错,但可以赋值。扩展为索引维度再对该索引元素赋值,其余扩充位置填充元素0
a(3:4,4:5)=[1 2;3 4] %通过组合索引赋值,先扩展维度再赋值
a(:,2)=[] %任意行第2列变为空:删除
% a(1,2)=[] %矩阵单个元素删除报错,删除单个元素无法保持矩阵维度
a(2)=[] %线性索引先按列优先扩展为单个数字序列,删除单个元素可行
1.11 重塑矩阵
1.重塑矩阵包括矩阵的元素重排、旋转、翻转、移位、排序等
2.认识函数
元素重排reshape
旋转rot90
左右翻转fliplr
上下翻转flipud
翻转flip
循环移位circshift
排序sort
按行排序sortrows
判断是否排序issorted
3.实例演示
%1_11
%作者:freexyn
a=[1 2 3 4;5 6 7 8]
reshape(a,4,2) %元素重排,参数:矩阵名称、重排行数、重排列数。重排规则:按列优先重排为所需维度
% reshape(a,3,3) %元素数量不符报错
rot90(a) %矩阵旋转:逆时针90度
fliplr(a) %矩阵左右翻转
flipud(a) %矩阵上下翻转
flip(a,1) %矩阵任意方向翻转:参数1为方向,1维方向是上下翻转
flip(a,2) %2维方向是左右翻转
circshift(a,[0 2]) %矩阵循环移位:矩阵、移动步长(用向量表示行数、列数),移动方向为坐标轴正方向
circshift(a,[-1 2])
sort(a) %矩阵元素的列排序:默认升序排列(行不保持)
sort(a,'descend') %参数:降序排列
issorted(a) %判断是否按升序已排列
issorted(a,'descend')
b=magic(3)
sortrows(b) %按行(保持)排序:将行视为整体,不指定参数则默认按每行第1元素大小升序排列
sortrows(b,2) %指定参数2,即按每行第2个元素排序
sortrows(b,3)
1.12 矩阵属性
1.矩阵的属性
描述矩阵的信息,包括大小、长度、元素数目和维度等
2.认识函数
大小size
长度length
元素数目numel
维度ndims
3.实例演示
%1_12
a=[1 2 3 4;5 6 7 8]
size(a) %矩阵行数列数
length(a) %矩阵长度:取行数、列数中的最大值
length(a') %矩阵转至后,长度仍为4
numel(a) %返回元素个数
ndims(a) %矩阵维度数:2即行和列(2维度)
ndims(a(1,:)) %组合索引提取出第1行索引再计算维度,即行向量的维度,结果2因仍为行和列(2维度)
ndims(a(1,1)) %提出1行1列元素计算维度,结果仍为2,因单元素认为1*1矩阵(2维度)
1.13 特殊矩阵形式
1.特殊的矩阵形式:空矩阵、标量和向量
2.认识函数
判断空矩阵isempty
判断标量isscalar
判断向量isvector
3.概念
3.1 空矩阵
有一个或多个等于零的维度(0×0,0×1,1×0)
3.2 标量
维度为1×1的矩阵,在Matlab中显示为单个实数或复数
3.3 向量
维度为1×n或n×1的矩阵,在Matlab中显示为一个行或一个列
4.实例演示
%1_13
%freexyn
a=[] %空矩阵
size(a) %获取行列数
length(a) %矩阵长度
numel(a) %元素个数
ndims(a) %矩阵维度
isempty(a) %判断是否空矩阵
zeros(0,1) %全0矩阵指定一个维度为0
a=2 %创建标量
size(a)
length(a)
numel(a)
ndims(a)
isempty(a)
isscalar(a) %判断是否为标量
a=[1 2 3] %创建向量
size(a)
length(a)
numel(a)
ndims(a)
isempty(a)
isscalar(a)
isvector(a) %判断是否向量
1.14 多维数组
1.多维数组的创建和索引方法
2.认识函数
维度简化squeeze
3.概念
Matlab中具有多于两个维度的数据阵列被称为多维数组
多维数组是普通二维矩阵的扩展
如图为3*3*2的三维数组(维度名称分别为行、列、页面)
3*3*2的三维数组
4.实例演示
%1_14
a=[1 2 3;4 5 6;7 8 9]
b=[11 12 13;14 15 16;17 18 19]
c=a
c(:,:,2)=b %数组c任意行任意列的第2个页面赋值数组b。显示时,对高维数组进行拆分,拆分为2维数组显示
ndims(c) %数组维度
size(c) %行、列、页面数
d=c %3维数组赋值给d
d(:,:,:,2)=c %d的任意行、列、页面的第4个维度的第2索引赋值一个3维数组c。显示时,高维数组依次拆分,遍历循环显示每个2维数组
ndims(d) %4维
size(d) %每个维度大小:3 3 2 2
%% 用创建矩阵的函数创建高维数组
zeros(2,2,2) %3维全0数组
repmat(10,[2 2 2]) %矩阵平铺重塑:将标量10平铺重塑为2行2列2页面的数组
reshape(c,[2 3 3]) %对高维数组进行重塑:c是3*3*2数组重塑为2*3*3数组
c(1,[1 2],2) %组合索引:访问数组c中第1行、第1和2列中、第2个页面的元素
d(:,:,1,1) %(4维数组)组合索引:任意行、列、第1页面、第四维度1的元素
c(1,1) %对于3维数组使用低维索引,索引第1行第1列,不指定页面,也可索引。高维数组使用低维索引,会自动用1补齐末尾索引
a(1,1,1) %低维数组用高维索引。原理:Matlab中任何数组都可理解为无限尾随1的高维数组
e=ones(2,2,1,1,1,1,1) %全1矩阵:2行2列,后面尾随1无实际意义
e=ones(2,2,1,1,1,2,1) %全1矩阵:2行2列,第6维为2,会将3、4、5、7维度初始化为0
squeeze(e) %维度简化:简化高维数组中不必要的维度
1.15 性能优化
1.在处理大型数组时,兼顾Matlab运算性能的优化
2.说明
使用大型数组时,尽量避免创建不必要的副本
处理数组容量不断变化的问题时,合理的进行预分配内存
把代码放入程序文件中,比在命令窗口中,运算效率高
3.实例演示
%1_15
a=magic(3)
a(3,3)=10
b=a %数据一样,变量名称不同,因此a、b变量同时指向了同一矩阵
a(3,3)=15 %执行该命令,先预分配内存并复制一份a的原始值,保留在上个语句b中,然后再改变a的元素值
%预分配内存:输入变量时会初始化分配所需内存,而后续编程中变量变化需要更多内存时,需额外内存支持,可能面临分布式的内存分布,调用效率受到影响,因此需预分配内存
a=zeros(300,300) %初始化300*300全0矩阵,Matlab会分配相应内存,在该维度内对元素进行相应修改替换,确保在完整内存中高效运行
% a=zeros(30000,30000)
(第一二章结束,后接第三章)
观看本文视频教程:freexyn编程实例视频教程系列1:Matlab基础入门