MATLAB基础语法总结

主体参照:全网最全MATLAB学习归纳总结(建模学习必备) 、 MATLAB讲解PPT和MATLAB官方帮助文档这里对该教程做一定的完善与汇总

1. MATLAB编辑器常用快捷键

1.1 编辑器窗口操作
编辑器窗口操作
自动整理代码 用鼠标选中代码行,按Ctrl + I (一般先 Ctrl+A 全选所有代码,再 Ctrl+I)
快速注释代码段 拖动鼠标选中需要注释的代码行,按Ctrl + R
快速取消注释代码段 拖动鼠标选中已经注释的代码行,按Ctrl + T
撤销改动 Ctrl + Z
取消撤销(撤销过多时使用) Ctrl + Y
多行代码增加缩进(代码段右移) 选中代码段,按 Tab键 或 Ctrl + ]
多行代码减少缩进(代码段左移) 选中代码段,按 Shift+Tab键 或 Ctrl + [
自动补全命令(记不全函数名时使用) 输入函数的前几个字母,再按Tab
查找或替换变量名、函数名 Ctrl + F
关闭当前的程序文本(.m)文件 Ctrl + W
在Editor窗体中切换 Ctrl+PageUp表示编辑器窗口向左切换文件
Ctrl+PageDown表示编辑器窗口向右切换文件
1.2 代码调试常用快捷键
代码调试常用快捷键:
运行 F5(可保存并直接运行程序)
执行选中代码段 F9
单步执行 F10
遇见子函数时,进入函数内部 F11
执行完子函数的剩余程序,并跳出子函数 Shift + F11
两种设置或取消断点的方法 (1) 在要设置断点的行左侧的-处单击;
(2) 可按F12设置断点。
直接跳至某行 按Ctrl + G,弹出对话框,输入行号,可直接跳转至对应行
一般在程序源代码很长时,调试程序使用
强制中断程序的运行 Ctrl + C
1.3 命令窗口
命令窗口
再现历史命令 上下光标键↑↓ ,在命令窗口中,上下光标键可以调用Matlab最近使用过的历史命令,便于快速重新执行。 如果输入命令的前几个字母,再使用光标键,则只会选择以这些字母开始的命令。 上下箭头寻找此前和此后输入的命令,每次一条。
快速退出MATLAB Ctrl + Q
清除输入的命令 Esc
将光标处至结尾之间的代码删除 Ctrl + K
what 显示当前工作路径中的所有代码文件
type 代码文件名 显示代码文件的内容
edit 启动编辑器,并新建一个空白文件
edit 代码文件名 打开相应代码文件
whatsnew 列出MATLAB新版本更新的内容
1.4 切换窗口
切换窗口
Ctrl+0 命令行窗口(Command Window)
Ctrl + Shift + 0 编辑器窗口(Editor)
Ctrl + 1 历史命令窗口(Command History)
Ctrl + 2 当前工作窗口(Current Folder)
Ctrl + 3 工作空间(Workspace)

2. MATLAB常用命令

2.1 管理会话的命令
命令 目的/作用
clc 清除命令窗口。
clear 从内存中删除变量。
help 搜索帮助主题。
exist 检查存在的文件或变量。
global 声明变量为全局。
lookfor 搜索帮助关键字条目。
quit 停止MATLAB。
who 列出当前变量。
whos 列出当前变量(长显示)。
2.2 系统命令
命令 目的/作用
cd 改变当前目录。
date 显示当前日期。
delete 删除一个文件。
diary 日记文件记录开/关切换。
dir 列出当前目录中的所有文件。
path 显示搜索路径。
pwd 显示当前目录。
save 保存在一个文件中的工作区变量。
load 负载工作区从一个文件中的变量。
type 显示一个文件的内容。
what 列出所有MATLAB文件在当前目录中。
wklread 读取.wk1电子表格文件。

3. MATLAB数据类型

  1. [ ] 矩阵

  2. { } 集合

  3. struct( ) 结构体

  4. ’ ’ 字符数组

  5. " " 字符串

4. MATLAB运算符

4.1 算数运算符
运算符 目的
+ 加;加法运算符
- 减;减法运算符
* 标量和矩阵乘法运算符
.* 数组乘法运算符
^ 标量和矩阵求幂运算符
.^ 数组求幂运算符
\ 矩阵左除
/ 矩阵右除
.\ 阵列左除
./ 阵列右除
= 赋值运算符

**注意:*/^ 等等,分为 数组乘法 和 矩阵乘法,数组乘法为 点乘 **

4.2 数据操作运算符
运算符 目的
: 向量生成;子阵提取
( ) 下标运算;参数定义
[ ] 矩阵生成
. 点乘运算,常与其他运算符联合使用
续行标志;行连续运算符
注意:… 后面内容将会被视作为注释
, 分行符(该行结果不显示)
; 语句结束;分行符(该行结果显示)
% 注释标志
多行注释:%{ 需要注释不执行的若干命令行 %}
_ 引用符号和转置运算符
._ 非共轭转置运算符
4.3 数学运算函数
运算函数 功能
log(x) / log2(x) / log10(x) 求 以e为底 / 以2为底 / 以10为底 x的对数
exp(x) 求e的指数
sqrt(x) 求根号下x的值 (等效于 x.^0.5 )
sqrtm(x) 求根号下x的值 (等效于 x^0.5)
pow2(x) 等效于 2^x
abs(x) 返回x的绝对值
sin(x) / cos(x) / tan(x) / cot(x) 返回x正弦值 / 余弦值 / 正切值 / 余切值 ,单位为弧度
sind(x) / cosd(x) / tand(x) / cotd(x) 返回x正弦值 / 余弦值 / 正切值 / 余切值 ,单位为角度
asin(x) / acos(x) / atan(x) 返回x反正弦值 / 反余弦值 / 反正切值 ,单位为弧度
asind(x) / acosd(x) / atand(x) 返回x反正弦值 / 反余弦值 / 反正切值 ,单位为弧度
deg2rad(x) / rad2deg(x) 角度切换为弧度 / 弧度切换为角度
sinh(x) / cosh(x) / tanh(x) 返回x双曲正弦值 / 双曲余弦值 / 双曲正切值
asinh(x) / acosh(x) / atanh(x) 返回x反双曲正弦值 / 反双曲余弦值 / 反双曲正切值
idivide(a,b, ‘ceil’) / idivide(a,b, ‘floor’) 整除函数,返回值: a/b;'ceil’表示向上取整,'floor’表示向下取整
注意使用前需要将a、b使用int32()强制类型转换
mod(a, b) 计算a / b 的余数
fix(x) / floor(x) / ceil(x) / round(x) 截断取整 / 向下取整 / 向上取整 / 四舍五入取整
4.4 关系运算符 / 逻辑运算符part1
运算符 功能
< <= == > >= ~= 小于 小于等于 等于 大于 大于等于 不等于
返回值为 逻辑0 或 逻辑1
~a a&b a|b xor(a, b)
not(a) and(a,b) or(a,b)
数组/标量 逻辑运算,返回值: 对标量元素取反
两标量均非零返回1 两标量至少一个元素非零返回1 两标量不同返回1
not(a) = ~a,and(a,b) = a&b,or(a,b) = a|b
a&&b a||b 标量 逻辑运算,不适用数组,常在if条件语句中使用,返回值同 & |

使用方法示例:

a = [1 2 3 ; 4 5 6];
b = [3 8 0 ; 1 5 2];
a >= b;     % 0 0 1 ; 1 1 1

a = [1 2 3 ; 4 5 6];
b = [1 8 3 ; 1 5 2];
a & b;      % 1 0 1 ; 0 1 0
4.5 逻辑运算符part2
函数 描述
and(A, B) 查找数组或标量输入的逻辑和;执行所有输入数组A,B等的逻辑AND,并返回包含设置为逻辑1(真)或逻辑0(假)的元素的数组。如果所有输入数组在同一个数组位置都包含一个非零元素,那么输出数组的一个元素将被设置为1;否则,该元素设置为0。
not(A) 查找数组或标量输入的逻辑NOT;执行输入数组A的逻辑NOT,并返回包含设置为逻辑1(真)或逻辑0(假)的元素的数组。如果输入数组在同一个数组位置包含一个零值元素,那么输出数组的一个元素将被设置为1;否则,该元素设置为0。
or(A, B) 查找数组或标量输入的逻辑或; 执行所有输入数组A,B等的逻辑或,并返回包含设置为逻辑1(真)或逻辑0(假)的元素的数组。如果任何输入数组在同一个数组位置包含一个非零元素,则输出数组的一个元素设置为1;否则,该元素设置为0。
xor(A, B) 逻辑异或; 对数组A和B的相应元素执行异或运算。如果A(i,j,…)或B(i,j)…,则所得到的元素C(i,j,…) j,…),但不是两者都是非零的。
all(A) 确定数组A的所有数组元素是否为非零或真。如果A是向量,则如果所有元素都为非零,则所有(A)返回逻辑1(真),如果一个或多个元素为零,则返回逻辑0(假)。如果A是非空矩阵,则所有(A)将A的列视为向量,返回逻辑1和0的行向量。如果A是空的0x0矩阵,则全部(A)返回逻辑1(真)。如果A是一个多维数组,则所有(A)都沿着第一个非指定维度行事,并返回一个逻辑值数组。 该尺寸的尺寸减小到1,而所有其他尺寸的尺寸保持不变。这个维度的大小减少到1,而其他所有维度的尺寸保持不变。
all(A, dim) 通过标量dim沿着维数A的维度进行测试。
any(A) 确定数组元素是否为非零;测试数组中不同维度的元素是否为非零数字,或是逻辑1(真)。 任何函数忽略NaN(不是数字)的条目。如果A是向量,任何(A)如果A的任何元素是非零数或逻辑1(真),则返回逻辑1(真),如果所有元素为零,则返回逻辑0(假)。如果A是非空矩阵,则任何(A)将A的列视为向量,返回逻辑1和0的行向量。如果A是一个空的0x0矩阵,任何(A)返回逻辑0(假)。如果A是一个多维数组,则任何(A)都沿着第一个非整数维进行操作,并返回一个逻辑值数组。该维度的尺寸减小到1,而所有其他维度的尺寸保持不变。
any(A,dim) 通过标量dim沿着维数A的维度进行测试。
false 逻辑0(假)
false(n) 是逻辑0的n×n矩阵
false(m, n) 是逻辑0的一个m×n矩阵。
false(m, n, p, …) 是由逻辑0的逐列逐列数组。
false(size(A)) 是与数组A大小相同的逻辑零数组。
false(…,‘like’,p) 是与逻辑阵列p相同的数据类型和稀疏性的逻辑零数组。
ind = find(X) 查找非零元素的索引和值;定位数组X的所有非零元素,并返回向量中这些元素的线性索引。 如果X是行向量,则返回的向量是行向量; 否则返回列向量。如果X不包含非零元素或是空数组,则返回一个空数组。
ind = find(X, k)ind = find(X, k, ‘first’) 最多返回与X的非零条目相对应的前k个索引。k必须是正整数,但它可以是任何数字数据类型。
ind = find(X, k, ‘last’) 最多返回与X的非零条目相对应的最后k个索引。
[row,col] = find(X, …) 返回矩阵X中非零条目的行和列索引。使用稀疏矩阵时,此语法特别有用。 如果X是N>2的N维数组,col包含列的线性索引。
[row,col,v] = find(X, …) 返回X中非零条目的列或行向量v,以及行和列索引。如果X是逻辑表达式,则v是逻辑数组。 输出v包含通过评估表达式X获得的逻辑数组的非零元素。
islogical(A) 确定输入是否为逻辑数组;如果A是逻辑数组,返回true,否则返回false。 如果A是从逻辑类派生的类的实例,它也返回true。
logical(A) 将数值转换为逻辑;返回一个可用于逻辑索引或逻辑测试的数组。
true 逻辑1(真)
true(n) 是一个n×n逻辑矩阵。
true(m, n) 是一个mxn逻辑矩阵。
true(m, n, p, …) 是由逻辑1的逐列逐列数组。
true(size(A)) 是与数组A大小相同的逻辑数组。
true(…,‘like’, p) 是与逻辑阵列p相同的数据类型和稀疏性的逻辑阵列。
isnan(x) 确定数组中哪些元素为NaN,若为NaN,则返回值为1
isinf(x) 确定数组中哪些元素为无限值,若为inf,则返回值为1
4.6 集合操作符
函数 描述
intersect(A,B) 设置两个数组的交集;返回A和B所共有的值。返回的值按排序顺序排列。
intersect(A,B,‘rows’) 将A和B的每一行作为单个实体处理,并返回A和B的公共行。返回的矩阵的行按排序顺序排列。
ismember(A,B) 返回与A大小相同的数组,包含1(true),其中A的元素在其他地方的B中找到,它返回0(false)。
ismember(A,B,‘rows’) 将A和B的每一行作为单个实体处理,并返回一个包含1(true)的向量,其中矩阵A的行也是B的行;否则,它返回0(false)。
issorted(A) 如果A的元素按排序顺序返回逻辑1(true),否则返回逻辑0(false)。输入A可以是向量,也可以是N-by-1或1-by-N的字符串数组。如果A和sort(A)的输出相等,则A被认为是排序的。
issorted(A, ‘rows’) 如果二维矩阵A的行按排序顺序返回逻辑1(真),否则返回逻辑0(假)。 如果A和排序(A)的输出相等,则认为矩阵A被排序。
setdiff(A,B) 设置两个数组的差值;返回不在B中的值。返回数组中的值按排序顺序排列。
setdiff(A,B,‘rows’) 将每一行A和B行作为单个实体处理,并返回一个不在B中的行。返回的矩阵的行按排序顺序排列。“行”选项不支持单元格数组。
setxor 设置两个数组的异或
union 设置两个数组的并集
unique 数组中唯一的值
4.7 状态检测操作符
函数 描述
iscell(x) 确定输入是否为元胞数组
iscellstr(x) 确定输入是否为字符向量元胞数组
ischar(x) 确定输入是否为字符数组
iscolumn(x) 确定输入是否为列向量
isrow(x) 确定输入是否为行向量
isvector(x) 确定输入是否为向量
isdiag(x) 确定矩阵是否为对角矩阵
istril(x) 确定矩阵是否为下三角矩阵
istriu(x) 确定矩阵是否为上三角矩阵
isempty(x) 确定输入是否为空数组
isfloat(x) 确定输入是否为浮点数组
isinteger(x) 确定输入是否为整数数组
isequal(A,B) 确定数组是否在数值上都相等
isnan(x) 检测不是数字 (NaN) 的数组元素
isinf(x) 检测数组的无限元(inf)
isspace(x) 检测数组中的空格字符
4.8 数据转换运算符
函数 描述
int8(x) / int16(x) / int32(x) / int64(x) 数据类型为 int16 的变量存储为 2 个字节的(16 位)有符号整数
uint16(x) 数据类型为 uint16 的变量存储为 2 个字节(16 位)的无符号整数
single(x) 单精度变量存储为数据类型Single的4字节(32位)浮点值。
double(x) 双精度变量存储为数据类型Double的8字节(64位)浮点值。
typecast(X,type) 将 X 的位模式转换为 type 指定的数据类型,而不更改基础数据
cast(A,newclass) 将 A 转换为数据类型newclass, newclass 是与 A 兼容的内置数据类型的名称
int8(x) / int16(x) / int32(x) / int64(x) 转化即为兼容模式转换
cast(-1,'uint8')       % 向上兼容,转化为0,
typecast(-1,'uint8')   % 65535

5. MATLAB变量

5.1 变量命名

以下内容摘选字C语言变量标识符规则;

1. 变量名由字母、数字、下划线组成,并且首字母不能是数字。
2. 不能把关键字作为变量名,例如:if、for、while等。
3. 变量名最长63字符。
4. 变量名严格区分大小写。
5. 变量名应做到"见名知意",例如,长度(外语:length),求和、总计(外语:sum),圆周率(外语:pi)

5.2 变量定义

用一个简单的方法指定变量,如:

x = 3

注意事项:

  • 在使用变量之前,必须进行赋值。
  • 当系统接收到一个变量之后,这个变量可以被引用。
  • 当表达式返回一个结果,不分配给任何变量,系统分配给一个变量命名ans,以后可以继续使用。
5.3 变量的关键字操作
关键字 操作
save 保存工作区中的所有变量,之后生成一个扩展名为.mat的文件
load 加载保存 .mat 数据文件,将文件中所有变量加载至工作区
who 显示所有已经使用的变量名
whos 显示所有已经使用的变量名及变量类型、变量大小、变量所占空间
clear 删除所有内存中的变量

应用举例:

a = 5;
b = 4;
c = 3;

save myfile;
% 保存a、b、c变量至 myfile.mat 文件中;

load myfile;
% 将保存在 myfile.mat 中的a、b、c变量加载至工作区;

who;
% 显示已使用变量名,输出:a b c

whos;
% 显示已使用变量名及变量类型、变量大小、变量所占空间,输出:

%  Name      Size            Bytes  Class     Attributes

%   a         1x1                 8            double              
%   b         1x1                 8            double              
%   c         1x1                 8            double    

clear;
% 删除内存中所有变量;
5.4 特殊变量和常量

MATLAB支持以下特殊变量和常量:

Name Meaning
ans 默认的变量名,以应答最近依次操作运算结果
eps 浮点数的相对误差
i,j 虚数单位,定义为 i^2 = j^2 = -1
Inf 代表无穷大
NaN 代表不定值(不是数字)
pi 圆周率

6. MATLAB输入输出

MATLAB提供了以下输入和输出相关的命令:

命令 作用/目的
disp 显示一个数字、数组、字符或字符串等的内容。
fprintf 执行格式化写入到屏幕或文件。
; 禁止标识符命令行输出
input 显示提示并等待输入。
fscanf 阅读从文件格式的数据。
format 控制屏幕显示的格式。

以下详细展示各种输入输出语法

a=1:10;

disp(a);
% 输出:1 2 3 4 5 6 7 8 9 10

% fprintf(fid, format, variables);
% fid为写入数据的文件,若缺省,则输出到屏幕
% format用来指定数据输出时采用的格式
% variables是用来存放数据的矩阵
fprintf(' %d ',a);
% 输出: 1  2  3  4  5  6  7  8  9  10 

% ;作用为静止命令行输出,如
a;    % 无输出
a     % 输出a = 1 2 3 4 5 6 7 8 9 10

% x = input(prompt);   
% 显示prompt中的文本(注意文本必须使用单引号)并等待用户输入值(数字、矩阵或变量)后按 Enter 键,数据将存储在 x 中
% str = input(prompt,'s');
% 显示prompt中的文本(注意文本必须使用单引号)并等待用户输入值,输入值将作为文本储存在 str 中
prompt = 'What is the original value? ';
x = input(prompt)
% What is the original value?   之后输入需要输入的命令行内容存储在 x 中

% fscanf用于读取数据文件(.txt)中的数据,从保存的.txt文件中的第一个数据开始往下读
fid=fopen('文件路径');
A=fscanf(fid,format,size);
[A,count] = fscanf(fid,format,size);
% A为存放读取的数据,一般为矩阵
% count为成功读取元素的个数
% format为读取的数据格式,如%d为十进制的读取格式
% size为A的数据格式,有如下三种:  
% inf  一直读到最后结束; N  读N个元素放入列向量; [M,N]  按列顺序读取至少一个M×N矩阵的M*N元素。N可以是inf,但M不能。

fscanf和fprintf命令的行为像C scanf和printf函数。他们支持格式如下代码:

格式代码 目的/作用
%s 输出字符串
%d 输出整数
%f 输出浮点数
%.xf 输出x位浮点小数
%e 显示科学计数法形式
%.xe 输出x位科学计数法
%g %f 和%e 的结合,根据数据选择适当的显示方式

7. MATLAB数据格式

Format函数 最多可显示
format short 四位小数(默认)
format long 15位小数
format short e 科学计数法显示,五位小数
format long e 科学计数法显示,15位小数
format bank 两位小数 (常用于 财务)
format + 正,负或零
format rat 分数
format compact 变量之间没有空行
format loose 变量之间有空行
4.678 * 4.9  % 22.9222

format long
4.678 * 4.9  % 22.922200000000000

format long e
4.678 * 4.9  % 2.292220000000000e+01

format short e
4.678 * 4.9  % 2.2922e+01

format bank
4.678 * 4.9  % 22.92

format rat  
4.678 * 4.9  % 2063/90  

format compact
% 默认情况,两个输出直接有一个空行,使用此命令取消空行

format + 
4.678 * 4.9  % + 

8. MATLAB向量

8.1 创建向量
8.1.1 直接定义向量
% 创建行向量
r = [7 8 9 10 11]; 
r = [7,8,9,10,11];
% 创建列向量
r = [7;8;9;10;11];
8.1.2 向量组合

使用 , 或 ; 进行向量组合
水平串联,两个矩阵是使用逗号 “,” 分隔开的;
垂直串联:两个矩阵是使用分号 “;” 分隔开的;

r1 = [2;3;4;5;6]; 
r2 = [7;8;9;10;11];
r3 = [r1;r2];  % 2;3;4;5;6;7;8;9;10;11
r4 = [r1,r2];  % 2,7;3,8;4,9;5,10;6,11

使用 cat() 进行向量组合

% r = cat(dim, r1, r2 ...)   
% r1, r2, … 是要连接的阵列,dim 是一起串联阵列的维度;一般用于升维度,向量升矩阵,矩阵升三维数组
r = cat(2, r1, r2);     % 2,7;3,8;4,9;5,10;6,11 

PS:若想将向量整体向前移 / 向后移,直接使用向量组合即可

r = [1 2 3 4];
% 向量向后移动,前面补一个0
r = [0 r];
8.1.3 使用 : 生成向量
% 使用 : 生成向量
% [首位元素 : 元素间隔 : 末尾元素]
r = [1 : 20];     % 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
r = [1: 2: 20];   % 1   3   5   7   9   11   13   15   17   19
r = [10: -1: 0];  % 10  9   8   7   6   5   4   3   2   1   0

% 注意新版本不需要[],直接使用: 即可
r = 1 : 20;     % 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
r = 1: 2: 20;   % 1   3   5   7   9   11   13   15   17   19
r = 10: -1: 0;  % 10  9   8   7   6   5   4   3   2   1   0
8.1.4 使用函数生成向量
% 使用linspace生成向量
% linspace(x1,xn,N); 在x1和xn之间生成等差数列,N为元素个数,缺省值为100
% 函数返回结果为:x1, x2, …… ,xn, 
r = linspace(1,10,10);  % 1 2 3 4 5 6 7 8 9 10
r = linspace(1,10);     % 1.00  1.09  1.18  1.27  1.36  1.45 …… 9.63  9.72  9.81  9.90  10

% 使用logspace生成向量
% logspace(x1,xn,N); 在x1和xn之间生成等差数列,N为元素个数,缺省值为50
% 函数返回结果为:10^x1, 10^x2, …… ,10^xn, 
r = logspace(1,4,4);  % 10^1 10^2 10^3 10^4
% logspace(x1,pi,N);  在 10^x1 和 pi 之间生成 n 个点
8.2 引用向量元素
% 创建行向量
r = [7 8 9 10 11]; 

r(3);      % 9
r(:);      % 7;8;9;10;11
r(2:4);    % 8 9 10
r([1 3 5]) % 7 9 11
8.3 向量四则运算
% 数字 * 向量
r = [7 8 9 10 11]; 
m = 5 * v  % 35 40 45 50 55

% 向量 加减
A = [7, 11, 15, 23, 9];
B = [2, 5, 13, 16, 20];
C = A + B;  % 9   16   28   39   29
D = A - B;  % 5    6    2    7  -11

% 向量 乘除
r1 = [7 8 9]; 
r2 = [1 2 3];
% 向量点乘
r3 = r1.*r2;       % 7 16 27
% 向量点积
r4 = dot(r1,r2);   % 50
% 向量乘法
r2=r2';            % r1向量不变,r2向量转置
r5 = r1*r2         % 50

r1=r1';            % r1向量转置,r2向量不变
r6 = r1*r2         % 7,14,21;8,16,24;9,18,27
8.4 向量变换

包含向量转置及向量的模

% 向量转置
r = [7 8 9 10 11]; 
v=r';   % 7;8;9;10;11

% 向量的模
% |r| = √(r1^2 + r2^2 + r3^2 + … + rn^2)
r = [1: 2: 20];  % 1     3     5     7     9    11    13    15    17    19
sv = v.* v;      % 1     9    25    49    81   121   169   225   289   361
dp = sum(sv);    %  1330
mag = sqrt(dp);  %  36.469165057620941

9. MATLAB矩阵

9.1 创建矩阵
9.1.1 直接定义矩阵
% 矩阵的同行元素之间用空格(或 “,”)隔开;
% 矩阵的行与行之间用 “;”(或回车符)隔开;
m = [1,2,3; 4 5 6 
     7 8,9];   % 创建矩阵
9.1.2 矩阵 组合

水平串联,两个矩阵是使用逗号 “,” 分隔开的;
垂直串联:两个矩阵是使用分号 “;” 分隔开的;

m = [1,2,3 4;5 6 7 8;9,10,11 12];   % 创建矩阵
% 矩阵组合
m = [-3 -2 -1 0;m];   % -3 -2 -1 0; 1 2 3 4; 5 6 7 8; 9 10 11 12
9.1.3 使用函数生成矩阵
函数 功能
zeros() 生成零矩阵
ones() 生成全1矩阵
eye() 创建一个单位矩阵
rand() 生成一个数组,元素为(0,1)上均匀分布的随机数
magic() 生成幻方矩阵
diag() 生成一个对角矩阵
zeros(3)   % 0 0 0 ; 0 0 0 ; 0 0 0
zeros(4,3) % 0 0 0 ; 0 0 0 ; 0 0 0 ; 0 0 0

ones(3)    % 1 1 1 ; 1 1 1 ; 1 1 1
ones(4,3)  % 1 1 1 ; 1 1 1 ; 1 1 1 ; 1 1 1

eye(3)     % 1 0 0 ; 0 1 0 ; 0 0 1

rand(2,3)  % 0.8147 0.9134 0.2785 ; 0.9058 0.6324 0.5469

magic(3)   % 8 1 6 ; 3 5 7 ; 4 9 2

B=rand(size(A))       % 生成和矩阵A大小相等的随机矩阵,对其他函数也适用

补充:不同rand()函数区别

% rand()函数,随机返回(0,1)之间的数
% randn()函数,随机返回(0,1)之间服从正态分布的数,即均值为0,方差为1
% randi(P,M,N)函数,随机返回 (0,P] 均匀分布的整数,M,N分别为行数和列数
9.2 引用矩阵元素
m = [1,2,3 4;5 6 7 8;9,10,11 12];   % 创建矩阵

m(2, 4);          % 8
m(2, :);          % 5 6 7 8
m(2, 2:3);        % 6 7
m(:, 3);          % 3; 7; 11
m(:, 2:3);        % 2 3; 6 7; 10 11
m(2:3, 2:4);      % 6 7 8; 10 11 12
m([1,3], [2,4]);  % 2 4; 10 12
m(2:3, [2,4]);    % 6 8; 10 12
m(:, [2,3,2,3]);  % 2 3 2 3 ; 6 7 6 7 ; 10 11 10 11 (使用[]引用时,可以引用多次)

% 注意MATLAB中数据按列存储
m(5);         % 6 
m(9);         % 11 
9.3 矩阵 行/列/元素 变换

包含:① 删除某行/列;② 矩阵组合;③ 矩阵元素修改

m = [1,2,3 4;5 6 7 8;9,10,11 12];   % 创建矩阵

% 删除整行或整列
m(3, :) = []    % 1 2 3 4; 5 6 7 8
m(:, 3) = []    % 1 2 4; 5 6 8; 9 10 12

% 矩阵 组合
m = [-3 -2 -1 0;m];   % -3 -2 -1 0; 1 2 3 4; 5 6 7 8; 9 10 11 12

% 矩阵元素修改
m(2,2) = 20;            % 仅修改单个元素  % 1,2,3,4; 5,20,7,8; 9,10,11,12 
m(:,2) = [20;22;24];    % 修改某列元素    % 1,20,3,4; 5,22,7,8; 9,24,11,12
m([1,3], [2,4]) = [10 20 ; 30 40];   % 修改多个元素    % 1,10,3,20; 5,6,7,8; 9,30,11,40
9.4 矩阵四则运算
%% 矩阵 与 标量 四则运算
a = [ 10 12 23 ; 14 8 6; 27 8 9];
b = 2;
c = a + b;  % 12 14 25 ; 16 10 8 ; 29 10 11
d = a - b;  % 8 10 21 ; 12 6 4 ; 25 6 7
d1 = b - a; % -8 -10 -21 ; -12 -6 -4 ; -25 -6 -7
e = a * b;  % 20 24 46 ; 28 16 12 ; 54 16 18
f = a / b;  % 5 6 11.5 ; 7 4 3 ; 13.5 4 4.5
f1 = b / a; % ERROR 报错


%% 矩阵运算
% 矩阵 加减
a = [ 1 2 3 ; 6 5 4; 5 9 1];
b = [ 7 5 6 ; 2 0 8; 5 7 1];
c = a + b  % 8 7 9; 8 5 12; 10 16 2
d = a - b  % -6 -3 -3; 4 5 -4; 0 2 0

% 矩阵乘除
% 注意区分矩阵的 左除\ 和 右除/
c = a * b ;                 % 26 26 25; 72 58 80; 58 32 103
d = a / b = a * inv(b) ;    % -0.5254,0.6864,0.6610; 0.7627,-0.0932,0.1695; -0.6441,0.3898,1.7458
e = a \ b = inv(a) * a ;    % -2.4048,-2.4286,0.0833; 1.6667,2.0000,-0.1667; 2.0238,1.1429,2.0833

% 矩阵点积 (拆分为每个列向量分别进行点积)
f = dot(a,b);   %  44 73 51  (1*7+6*2+5*5  2*5+0+9*7  3*6+4*8+1)

%% 数组运算
a = [ 1 2 3 ; 6 5 4; 5 9 1];
b = [ 7 5 6 ; 2 0 8; 5 7 1];
c = a .* b ;    % 7 10 18 ; 12 5 32 ; 25 63 1
d = a ./ b ;    % 0.1429 0.4 0.5 ; 3 inf 0.5 ; 1 1.2857 1
e = a .\ b ;    % 7 2.5 2 ; 0.3333 0 2 ; 1 0.7778 1
9.5 矩阵变换

1) 矩阵的转置 / 矩阵的逆 / 矩阵的行列式 等;
2) 矩阵的矢 / 矩阵的特征值 / 矩阵的范数
3) 矩阵分解

%% 
% 矩阵的转置
a = [ 10 12 23; 14 8 6; 27 8 9];
a';  %10  14  27 ; 12  8  8 ; 23  6  9

% 矩阵复共轭转置
z=[1+i 3-2i ; 2+2i 4-i];
z';               % 复共轭转置 [1-i 2-2i ; 3+2i 4+i]
z.';              % 普通转置   [1+i 2+2i ; 3-2i 4-i]
conj(z);          % z的共轭    [1-i 3+2i ; 2-2i 4+i]
transpose(z);     % 普通转置   [1+i 2+2i ; 3-2i 4-i]  

% 矩阵的行列式
a = [1 2 3; 2 3 4; 1 2 5]; 
det(a);  % -2

% 矩阵的逆矩阵
a = [1 2 3; 2 3 4; 1 2 5]; 
inv(a)=a^-1;  % -3.5 2 0.5 ; 3 -1 -1 ; -0.5 0 0.5

%% 
% 矩阵的秩
a = [1 2 3; 2 3 4; 1 2 5]; 
rank(a);    % 求矩阵的矢,矩阵a矢为 3
a = [1 2 3 ; 4 5 6 ; 7 8 9];
rank(a);    % 求矩阵的矢,矩阵a矢为 2

% 矩阵特征值及特征向量
A = [1 2 3; 2 3 4; 1 2 5];
eig(A);         % 返回 A 的特征值 (3*3矩阵有3个特征值,返回一列向量)
[V,D] = eig(A)  % D为矩阵A特征值,V为矩阵A右特征向量

% 矩阵的范数
A = [1 2 3; 2 3 4; 1 2 5]; 
norm(A,1);      % 向量/矩阵A的第一范数
norm(A,2);      % 向量/矩阵A的第二范数
norm(A,inf);    % 向量/矩阵A的无穷大范数
norm(A,'fro');  % 矩阵A的Frobenius范数

%% 矩阵的分解
A = [1 2 3; 2 13 18; 3 18 50];
R = chol(A);    % Cholesky分解, A=R'*R, A必须是正定矩阵(正特征值的对称矩阵);  R = 1 2 3 ; 0 3 4 ; 0 0 5 

A = [1 2 3; 4 5 6; 7 8 0];
[L,U]=lu(A);    % LU分解,A = L*U, U为上三角矩阵, L为下三角矩阵

A = [1 2 3 ; 4 5 6 ; 7 8 9];
[Q,R]=qr(A);    % QR分解,Q*Q'=I, R为上三角矩阵
9.6 数组变换函数
命令 作用/目的
find 查找非零元素的索引
length 最大数组维度长度
max 按列返回最大元素
min 按列返回最小元素
reshape 重新调整矩阵的行数、列数、维数
size 计算数组大小
sort 排序每个列
sum 每列相加
prod 计算矩阵每列乘积
mean 按列返回数组均值
std 按列返回数组标准差
var 按列返回数组方差
numel 计算矩阵所含元素个数
cross 计算矩阵交叉乘积
dot 计算矩阵点积
pinv 计算矩阵的伪逆
rank 计算矩阵的秩
rref 将矩阵化成行最简形
cell 创建单元数组
celldisp 显示单元数组
cellplot 显示单元数组的图形表示
num2cell 将数值阵列转化为异质阵列
deal 匹配输入和输出列表
iscell 判断是否为元胞类型
length 矢量长度或最大阵列尺寸
ndims 数组维数
iscolumn 确定输入是否是列向量
isempty 确定数组是否为空
ismatrix 确定输入是否为矩阵
isrow 确定输入是否为行向量
isscalar 确定输入是否为标量
isvector 确定输入是否为矢量
blkdiag 从输入参数构造块对角矩阵
circshift 循环移位
ctranspose 复数共轭转置
diag 矩阵的对角矩阵和对角线
flipdim 沿指定维度翻转数组
fliplr 从左到右翻转矩阵
flipud 将矩阵向下翻转
ipermute n-维阵列的反置换维数
permute 重新排列 N 维数组的维数
repmat 复制和平铺数组
rot90 旋转矩阵90度
shiftdim 移位维度
issorted 确定集合元素是否按排序顺序排列
sortrows 按升序对行排序
squeeze 删除单维度
transpose 转置
vectorize 矢量化表达式
tril 提取矩阵主对角线及以下元素
triu 提取矩阵主对角线及以上元素

常用函数举例:

% find()函数 
% 查找非零元素的索引
x=[1 2 3 0 0 6 7 8 9];
find(x);  % 1 2 3 6 7 8 9
find(x>2) % 3 6 7 8 9
find(x<5) % 1 2 3 4 5
 
x=[1 2 3;0 0 6;7 8 9];
find(x);  % 1 3 4 6 7 8 9 (矩阵按列存储)
[r,c]=find(x);    % 1 1 ; 3 1 ; 1 2 ; 3 2 ; 1 3 ; 2 3  (第1行第1个数据, 第3行第1个数据……) 
[r,c,v]=find(x);  % 1 1 1 ; 3 1 7 ; 1 2 2; ……  (第1行第1个数据,值为1, 第3行第1个数据,值为7……)

% 特殊用法
% find函数可以用来选择函数元素
% 选择偶数变量元素
A = [5, 6, 7];
temp = find(~mod(A,2));    % ~mod(A,2)  0 1 0 ;  temp 2
A = A(temp);   % 6
% 选择非NaN变量元素
A = [5, 5, NaN];
temp = find(~isnan(A));    % ~isnan(A)  1 1 0 ;  temp 1 2
A = A(temp);   % 5 5

% length()函数 
% 最大数组维度长度
x=[1 2 3 0 0 6 7 8 9];
length(x);  % 9
x=[1 2 3 0 ; 6 7 8 9];
length(x);  % 4
% 注:length()=max(size())

% max()函数 
% 按列返回最大元素
a = [1 2 3 4 5 6];  
max(a);  % 6
a = [1 2 3 ; 4 5 6];
max(a);  % 4 5 6 ;(按列求最大值)
a = [1 4 9];
b = [2 5 7];
max(a, b);  % 2 5 9
m = [1 2 3 ; 4 5 6];
[a,b] = max(m);  % a = 4 5 6 ; b = 2 2 2; (a为元素最大值,b为最大值所处位置)

% reshape(a,m,n)函数 
% 按列读取原数据a,并排成新的m行n列数据
a = [1 4 7 10 ; 2 5 8 11 ; 3 6 9 12];
a = reshape(a, 2, 6);  % 1 3 5 7 9 11 ; 2 4 6 8 10 12

% size()函数
% 计算数组维度大小
a = [1 4 7 10 ; 2 5 8 11 ; 3 6 9 12];
size(a);              % 3 4
[m, n] = size(a);     % m=3;n=4
size(a, 1);           % 3
size(a, 2);           % 4
B=rand(size(A))       % 生成和矩阵A大小相等的随机矩阵

% sum()函数
% 数组每列相加
a = [1 4 7 10 ; 2 5 8 11 ; 3 6 9 12];
sum(a);              % 6  15  24  33
sum(a, 1);           % 6  15  24  33
sum(a, 2);           % 22 ; 26 ; 30

% prod()函数
% 数组每列相乘
a = [1 4 7 10 ; 2 5 8 11 ; 3 6 9 12];
prod(a);             % 6  120  504  1320
prod(a, 1);          % 6  120  504  1320
prod(a, 2);          % 280 ; 880 ; 1944

% mean()均值函数
% 按列返回均值
a = [1 4 7 10 ; 2 5 8 11 ; 3 6 9 12];
mean(a);             % 2  5  8  11
mean(a, 1);          % 2  5  8  11
mean(a, 2);          % 5.5 ; 6.5 ; 7.5

% std()函数,var()函数
% 按列返回标准差,按列返回方差,
a = [1 4 7 10 ; 2 5 8 11 ; 3 6 9 12];
std(a);       % 1  1  1  1
var(a);       % 1  1  1  1
% 注意,函数第二个系数是权重因子,默认为0
std(a,0,2)    % 3.873 ; 3.873 ; 3.873 
var(a,0,2)    % 15 ; 15 ; 15 

% sort()函数
% Y=sort(X,DIM,MODE), DIM表示对哪一个维数进行排列;MODE表示按哪一种模式进行排序,MODE=‘ASCEND’升序,MODE=‘DESCEND’降序
a = [1 5 25 10 ; 2 7 18 11 ; 1 6 9 3];
sort(a);      % 1 5 9 3 ; 1 6 18 10 ; 2 7 25 11
sort(a,2);    % 1 5 10 25 ; 2 7 11 18 ; 1 3 6 9
sort(a,1,'DESCEND');  % 2 7 25 11 ; 1 6 18 10 ; 1 5 9 3

% numel()函数
% 计算矩阵所含元素个数
a = [1 5 25 10 ; 2 7 18 11 ; 1 6 9 3];
numel(a);      % 12

% diag()函数
% diag()函数表示生成对角矩阵,后面1(-1)代表对角矩阵向→移/向↓移
diag([1 2 3 4])     % 1 0 0 0; 0 2 0 0; 0 0 3 0; 0 0 0 4
diag([1 2 3],1)     % 0 1 0 0; 0 0 2 0; 0 0 0 3; 0 0 0 0  (1表示向→移动)
diag([1 2 3],-1)    % 0 0 0 0; 1 0 0 0; 0 2 0 0; 0 0 3 0  (-1表示向↓移动)

% repmat()函数
% 复制和平铺数组
a = repmat([1,2;3,4],2,3);  % 1 2 1 2 1 2 ; 3 4 3 4 3 4 ; 1 2 1 2 1 2 ; 3 4 3 4 3 4

% flipud()函数
% 从上到下翻转矩阵
a = [1 2 3 ; 4 5 6 ; 7 8 9];
flipud(a);     % 7 8 9 ; 4 5 6 ; 1 2 3

% fliplr()函数
% 从左到右翻转矩阵
a = [1 2 3 ; 4 5 6 ; 7 8 9];
fliplr(a);     % 3 2 1 ; 6 5 4 ; 9 8 7

% rot90()函数
% 旋转矩阵90度
a = [1 2 3 ; 4 5 6 ; 7 8 9];
rot90(a);      % 3 6 9 ; 2 5 8 ; 1 4 7

% ndims()函数   
% 返回数组维度,一位数组/二维数组……
a = [1 2 3 ; 4 5 6 ; 7 8 9];
ndims(a);     % 2

% tril()函数(triu()函数同理)
% 提取矩阵主对角线及以下元素
a = [1 2 3 4; 4 5 6 7; 7 8 9 10; 10 11 12 13];
tril(a);    % 1 0 0 0 ; 4 5 0 0 ; 7 8 9 0 ; 10 11 12 13 (提取 主对角线 及 对角线以下 元素)
tril(a,1);  % 1 2 0 0 ; 4 5 6 0 ; 7 8 9 10 ; 10 11 12 13 (提取 主对角线上1行 及 对角线上1行以下 元素),1根据实际需求确定

10. 数组

10.1 多维数组
10.1.1 直接定义多维数组
a = [7 9 5; 6 1 9; 4 3 2];
a(:, :, 2)= [1 2 3; 4 5 6; 7 8 9];

% 输出结果为:
% a(:,:,1) = 7 9 5 ; 6 1 9 ; 4 3 2
% a(:,:,2) = 1 2 3 ; 4 5 6 ; 7 8 9
10.1.2 使用 cat() 函数来建立多维数组
% r = cat(dim, r1, r2 ...)   
% r1, r2, … 是要连接的阵列,dim 是一起串联阵列的维度;一般用于升维度,向量升矩阵,矩阵升三维数组
r1 = [9 8 7; 6 5 4; 3 2 1];
r2 = [1 2 3; 4 5 6; 7 8 9];
r = cat(3, r1, r2, [2 3 1; 4 7 8; 3 9 0])

% 输出结果:
% c(:,:,1) = 9 8 7; 6 5 4; 3 2 1
% c(:,:,2) = 1 2 3; 4 5 6; 7 8 9
% c(:,:,3) = 2 3 1; 4 7 8; 3 9 0
10.1.3 使用函数创建

使用 ones(), zeros() 或 rand() 函数建立多维数组

如:ones(3,3,2);

10.1.4 多维数组使用

多维数组经常转化为二维数组(矩阵)操作,如:

c(:,:,1) = 9 8 7; 6 5 4; 3 2 1
c(:,:,2) = 1 2 3; 4 5 6; 7 8 9
c(:,:,3) = 2 3 1; 4 7 8; 3 9 0

% 对于 c 这个三维数组,分别对c(:,:,1),c(:,:,2),c(:,:,3) 三个二维数组(矩阵)进行操作
10.2 单元阵列(又叫:元胞数组、cell)

元胞数组是一种包含名为元胞的索引数据容器的数据类型,其中的每个元胞都可以包含任意类型的数据。

10.2.1 单元阵列的创建
% 预先分配空间
A=cell(2,3);                   % {} {} {}; {} {} {}

% 直接赋值
B={[1,2,3,4],'Chenglin Li'};   % {[1 2 3 4]}  {'Chenglin Li'}

% 使用函数创建 
% num2cell()  把数值数组转换为 cell 数组 
A = [1 2 3;4 5 6];    % 1 2 3 ; 4 5 6
B = num2cell(A);      % {[1]} {[2]} {[3]} ; {[4]} {[5]} {[6]}
% 补充:cell2mat()  把cell数组转换为 普通数组

% 单元阵列组合
A = {'列1','列2','列3'};
B = num2cell(rand(3,3));
C = [A ; B];   % C为 A和B 按照列进行组合
%   {'列1'}     {'列2'}     {'列3'} 
% {[0.8147]}  {[0.9134]}  {[0.2785]} 
% {[0.9058]}  {[0.6324]}  {[0.5469] 
% {[0.1270]}  {[0.0975]}  {[0.9575]}
10.2.2 单元阵列元素修改
% 预先分配空间
A=cell(2,3);                   % {} {} {}; {} {} {}

% 单独赋值使用 {}
A{1}=[1,2,3,4];                % {[1 2 3 4]} {[]} {[]} ; {[]} {[]} {[]}
A{2,1}=[1,2,3,4];              % {[]} {[]} {[]} ; {[1 2 3 4]} {[]} {[]}

% 整体赋值使用()
A(1)={[1,2,3,4]};              % {[1 2 3 4]} {[]} {[]} ; {[]} {[]} {[]}
A(1,:)={[1,2,3,4],'Chenglin Li',[]};   % {[1,2,3,4]},{'Chenglin Li'},{[]} ; {[]} {[]} {[]}
10.2.3 单元阵列使用
A=cell(2,3);                   % {} {} {}; {} {} {}
A(1,:)={[],[1,2,3,4],'Chenglin Li'}   % {[]},{[1,2,3,4]},{'Chenglin Li'}; {[]} {[]} {[]}

A(1,2) %  [1 2 3 4]  (是一个 1×4的double 矩阵)
A{1,2} %  1 2 3 4    (是 矩阵里面的值)

11. 数据导入 / 导出

11.1 纯数字文件 导入 / 导出 .mat (.txt .csv) 文件
a = 5;
b = 1: 10 ;
c = [1: 5 ; 10 -3 0.2 77 7.1];
d = '测试测试测试';

save myfile;    % 保存a、b、c、d变量至 myfile.mat 文件中;
save('myfile.txt', 'c', '-ascii')   % 保存c变量至 myfile.txt 文件中;注意此方法只能保存纯数字文件

load myfile;    % 将保存在 myfile.mat 中的a、b、c变量加载至工作区;
load myfile.txt   % 将保存在 myfile.txt 中的数据载至工作区,数据名为: myfile;  注:此方法仅能导入纯数字文件
load myfile.csv   % 将保存在 myfile.csv 中的数据载至工作区,数据名为: myfile;  注:此方法仅能导入纯数字文件
11.2.1 导入Excel文件

导入 [表格.xlsx](.\MATLAB 图片截屏\表格.xlsx) 文件,内容如下

横轴1 横轴2 横轴3
纵轴1 11 12 13
纵轴2 21 zero 23
纵轴3 31 32 33
% 1:readcell('filename'),以cell(元胞数组,注:访问cell元素用{ })格式导入所有信息,空格被识别为missing
data = readcell('表格.xlsx');      
% [1x1 missing] ['横轴1'] ['横轴2'] ['横轴3'] 
% ['纵轴1'] [11] [12] [13]
% ['纵轴2'] [21] ['zero'] [23] 
% ['纵轴3'] [31] [32] [33]
strcmp(class(data{1,1}),'missing');     % 判断 [1,1] 单元格值是否为空,返回值逻辑1

% 2:[NUM,TXT,RAW]=xlsread('filename'),NUM返回的是数字数据,TXT返回的是文本内容,RAW返回的是所有数据(空格识别为NaN)
%    reference=xlsread('filename'),以数字数组格式导入除了文字以外的行,非数字的字符(包括空格)被识别为NaN
[NUM,TXT,RAW]=xlsread('表格.xlsx');
% NUM   11 12 13 ; 21 NaN 23 ; 31 32 33
% TXT   [] ['横轴1'] ['横轴2'] ['横轴3'] ; ['纵轴1'] [] [] [] ; ['纵轴2'] [] ['zero'] [] ; ['纵轴3'] [] [] []
% RAW   RAW内值与 之前使用readcell() 读取值相同,但是空格被识别为 NaN ,而不是 missing
reference=xlsread('表格.xlsx');
% reference   11 12 13 ; 21 NaN 23 ; 31 32 33

% 3:importdata('filename')  % 返回值为结构体,data保存数字信息,textdata保存文本信息
str=importdata('表格.xlsx'); % str为结构体,结构体内data值与使用xlsread() NUM相同,textdata值与使用xlsread() TXT相同
% 结构体成员使用方法:NUM = str.data; TXT = str.textdata;之后可分别对NUM和TXT进行操作;

% 4:使用 load('filename')   不推荐,一般用来读取 txt 或mat文件

% 5:使用 fscanf('filename') 不推荐,一般用来读取txt文件
11.2.2 导出Excel文件

导出excel使用xlswrite()

% xlswrite('filename', 变量, sheet的编号, 写入位置) 
A = [1 2 3 ; 4 5 6];
xlswrite('data.xlsx',A,2,'B2')   % 将A变量,写入data.xlsx文件的 sheet2,从B2开始写入

B = {[],'横轴1','横轴2' ; '纵轴1',[1],[2] ; '纵轴2',[3],[4]};  
xlswrite('data.xlsx',B,2,'B2')   % 将B变量,写入data.xlsx文件的 sheet2,从B2开始写入
% 写入结果如图所示:

写入结果如图所示:

11.3 导入导出.txt文件
%%%%%% 导入 %%%%%%
% 1. 纯数字文档导入,参考 11.1 纯数字文件 导入导出 .mat(.txt)文件

% 2. 同时含有数字 / 文字,使用importdata()函数,导入结果类似表格导入
% 定义 文本.txt ,内容为:
%{
第一行 第二行
第三行 第四行
1 2
3 4
%}
str=importdata('文本.txt')   
% str.data {['第一行']['第二行'];['第三行']['第四行']}, str.textdata {[1][2];[3][4]}

%%%%%% 导出 %%%%%%
% 1. 纯数字文档导出,参考 11.1 纯数字文件 导入导出 .mat(.txt .csv)文件

% 2. 使用fscanf('filename')、fprintf('filename')导入导出,以导出为例
% 例1
a=[17 24 1 8 15;23 5 7 14 16 ;4 6 13 20 22 ;10 12 19 21 3 ;11 18 25 2 9 ];
fid = fopen('文本.txt','w'); % 'w' 打开文件待写,'r' 打开文件待读,'a' 打开或者新建待写文件;把数据附加在文件尾部
fprintf(fid,'%d\n',a);  % a中每个元素,以%d(整数)形式保存,每个元素以\n(回车)分割
fclose(fid);   % 关闭保存
% 例2
x = 0:.1:1;
A = [x; exp(x)];
fid = fopen('文本.txt','w'); % 'w' 打开文件待写,'r' 打开文件待读,'a' 打开或者新建待写文件;把数据附加在文件尾部
fprintf(fid,'%6s %12s\n','x','exp(x)');   % 保存 x 和 exp(x) 字符,格式 %6s,(字符及前空格共占6半角)
fprintf(fid,'%6s,%12s\n','x','exp(x)');   % 保存 x 和 exp(x) 字符,格式 %6s,(字符及前空格共占6半角),中间, 分割
% 矩阵按列保存数据
fprintf(fid,'%6.3f %12.4f\n',A);   % 保存矩阵A值,格式 %6.3f,(字符及前空格共占6半角,保留3位小数)
fprintf(fid,'%6.3f,%12.4f\t',A(:,1:5));   % 保存矩阵A(:,1:5)值,注意中间使用 \t(回车)分割
fprintf(fid,'%s\n',A(1,:));    % 保存矩阵A值,格式 %s
fclose(fid);   % 关闭保存
% 输出数据见文件

% 3. 使用dlmwrite导出,仅适用于纯数字文档
dlmwrite('data.txt', a, 'delimiter', '\t','precision', 6 , '-append', 'roffset',2,'coffset',2);
% 将a中数据导出至data.txt,分隔符为'\t'回车符,数字保持6位精度,append表示向后添加不覆盖,默认为直接覆盖;roffset表示向右偏移2单位,可以不使用,coffset同理;

% 4. 使用writetable导出
B = {[],'横轴1','横轴2' ; '纵轴1',[1],[2] ; '纵轴2',[3],[4]};  
tab = table(B);   % 将元胞数组转化为table表格
writetable(tab, 'data.txt');   % 将tab数据保存至data.txt中,数据直接以 , 进行分割

[例2导出数据文件](.\MATLAB 图片截屏\文本.txt)

11.4 导入导出.csv文件
%%%%%% 导入 %%%%%%
% 1. 纯数字文档导入,参考 11.1 纯数字文件 导入导出 .mat(.txt .csv)文件

% 2. 纯数字导入csv文件
% csvread('filename', row, col, range)  % row,col 表示读取第row行以下、第col列以左的数据
% range[R1 C1 R2 C2],R1=row,C1=col,表示读取第row行以下、第col列以左的数据,读取到第R2行,C2行结束;
% csv文件:1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ; 13 14 15 16
data=csvread('数据.csv', 1, 1, [1 1 ; 2 2]);   % 6 7 ; 10 11

% 3. 纯数字文档,最简单导入方法,直接拖入工作区,即可加载数据

% 4. 同时含有数字 / 文字,使用importdata()函数,导入结果类似表格导入
str=importdata('数据.csv');   

%%%%%% 导出 %%%%%%
% 1. 纯数字写入csv文档
% csvwrite('filename',M,R,C);  % 写矩阵M到fielname表格中,从表格第R行,第C列写入
csvwrite('data.csv',data);

% 2. 使用dlmwrite导出
% 仅需把分隔符换位 , 即可,其余使用方法与导出txt文档方法相同,文档名 .txt 改为 .csv 即可,仅适用于纯数字文档

% 3. 使用writetable
% 因为.csv文档,本质为,分割文档,所以使用方法与导出txt文档完全相同,文档名 .txt 改为 .csv 即可
11.5 读写文档相关函数(配合fprintf使用)
函数 描述
fprintf 将数据写入文本文件
fscanf 从文本文件读取数据
fopen 打开文件, 或获取有关打开的文件的信息
fclose 关闭一个或全部已打开的文件
feof 测试文件结尾
ferror 有关文件I / O错误的信息
fgetl 从文件读取行, 删除换行符
fgets 从文件读取行, 保留换行符
fread 从二进制文件读取数据
frewind 将文件位置指示器移动到打开文件的开头
fseek 移动到文件中的指定位置
ftell 获得打开文件的位置
fwrite 将数据写入二进制文件

12. 二维绘图 参照绘图命令汇总

12.1 绘图基本步骤

MATLAB中绘图步骤如下:

  1. 先定义变量 x,通过指定的变量 x 值的范围,该函数被绘制;
  2. 然后定义函数, y = f(x);
  3. 最后调用 plot 命令,如 plot(x, y)。
x = [0:0.01:10];
y = sin(x);
plot(x, y)

特殊运用举例:

% plot(y)    % 等效于plot(x, y),y的维数是m,x = 1:m
% 若x,y 中一个为向量,另一个为矩阵,则矩阵按列或行分解成向量,再与原向量配对分别画出
x = [0:0.01:10];
y = [sin(x);cos(x)];
plot(x, y)

生成图像如图:

12.1.1 图像处理命令
x = [0:0.01:10];
y = sin(x);
plot(x, y);

xlabel('x');                   % 显示沿x轴的标签
% xlabel('x','FontName','Times New Roman','FontSize',14)                % 字体,字号
ylabel('sin(x)');              % 显示沿y轴的标签
% ylabel('sin(x)','FontName','隶书','FontSize',14,'Rotation',0)          % 字体,字号,y横向显示
title('sin(x) 图像');           % 显示图表标题
% title('sin(x) 图像','FontName','宋体','FontSize',16,‘FontWeight’,’bold’)     % 字体,字号,加粗
% 字体设置:
% 'FontName','Times New Roman' 使用Times New Roman字体;   'FontSize',14 字体字号14;
% ‘FontWeight’,’bold’ 加粗;    ‘FontAngle’,’italic’ 斜体;

legend('sin(x)');              % 显示图像图例
% legend('sin(x),'Location','best')        % 图例显示在最佳位置

grid on;                       % 生成网格线
% gird off                     % 关闭网格线

axis auto normal;              % 区间自动调整
% axis([-0.5 10.5 -1.2 1.2])   % 设置轴刻度,axis( [xmin xmax ymin ymax] )
colordef white;                % 设置背景颜色,如:colordef white,colordef black,colordef none ……

% text(pi,0,'Zeros Point')     % text(x,y,‘string’) 在图形中指定位置显示字符串
axis命令 行为
axis([xmin xmax ymin ymax]) 设置坐标轴在指定的区间
axis auto 将当前绘图区的坐标轴范围设置为MATLAB自动调整的区间
axis normal 自动调整纵横轴比例,使当前坐标轴范围内的图形显示达到最佳效果
常用:axis auto normal;
axis manual 冻结当前坐标轴范围,以后叠加绘图都在当前坐标轴范围内显示
axis tight 采用紧密模式设置当前坐标轴范围,即一用户数据范围为坐标轴范围
axis equal 等比例坐标轴
axis square 以当前坐标轴范围为基础,将坐标轴区域调整为方格形

生成图像如图:

12.1.2 曲线处理命令
x = [0:0.1:10];
y = sin(x);
plot(x, y, 'cx--');   % c表示青色,--表示虚线,x表示 x 标记点
% plot(x, y, 'cx--','linewidth',1.5,'MarkerSize',10);   
% linewidth表示线宽,线宽1.5;
% MarkerSize表示标记点大小,标记点为10;
% MarkerEdgeColor表示标记点边框颜色
% MarkerFaceColor表示标记点内部区域填充颜色

指令汇总:

Code 颜色 color
w 白色 White
k 黑色 Black
b 蓝色 Blue
r 红色 Red
c 青色 Cyan
g 绿色 Green
m 品红色 Magenta
y 黄色 Yellow
Code 线型
- 实线
: 点线
-. 点划线
虚线
Code 标记点
. . 标记点
o o 标记点
x x 标记点
+ + 标记点
s □ 标记点
d ◇ 标记点
v、^ 、<、> △ 标记点(分别为下三角、上三角、左三角、右三角)
p ☆ 标记点
h 六角形 标记点
* * 标记点

生成图像如图:品红色虚线

12.2 绘制多幅图
12.2.1 同一张图上绘制多个函数

使用plot(X1,Y1,...,Xn,Yn)绘制

x = [-10 : 0.01: 10];
y = 3*x.^4 + 2 * x.^3 + 7 * x.^2 + 2 * x + 9;
g = 5 * x.^3 + 9 * x + 2;
plot(x, y, 'r-', x, g, 'g--')
legend('sin(x)','cox(x)')          % 显示图像图例

生成图像如图:

12.2.2 生成子图

使用subplot(m,n,p)生成子图,把窗口分成m×n个小窗口,并把第p个窗口当作当前窗口;

x = [0:0.01:5];

y = exp(-1.5*x).*sin(10*x);
subplot(2,1,1)     % 子图共占2行,1列,显示第1个子图
plot(x,y)

y = exp(-3.5*x).*sin(10*x);
subplot(2,1,2)     % 子图共占2行,1列,显示第2个子图
plot(x,y)

生成图像如图:

12.2.3 多重作图(已存在的图形中加新的图形)

多重作图使用hold on命令,在已存在的图形中加新的图形。

x = [-10 : 0.01: 10];
y = 3*x.^4 + 2 * x.^3 + 7 * x.^2 + 2 * x + 9;
g = 5 * x.^3 + 9 * x + 2;
plot(x, y, 'r-')
hold on
plot(x, g, 'g--')
legend('sin(x)','cox(x)')          % 显示图像图例
hold off

生成图像如图:

12.2.4 同时绘制多幅图形

通过figure指令,创建多个图形串口。

x = [-10 : 0.01: 10];
y = 3*x.^4 + 2 * x.^3 + 7 * x.^2 + 2 * x + 9;
g = 5 * x.^3 + 9 * x + 2;
figure
plot(x, y, 'r-')
figure
plot(x, g, 'g--')

生成图像如图(Figure1 Figure2):

12.2.5 同一坐标轴系使用不同的y坐标
x=-2*pi: pi/10: 2*pi;
y=sin(x);
z=2*cos(x);
subplot(2,1,1) 
plot(x,y,x,z)

subplot(2,1,2)
plotyy(x,y,x,z)

生成图像如图(上图正常曲线,下图为使用不同坐标曲线):

12.3 其他图形曲线
12.3.1 条形图
x = [1:10];
y = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95];
bar(x,y)             % 绘制二维条形图
% bar(x,y,0.5)       % 绘制二维条形图,线宽0.5

% barh(x,y)          % 绘制二维水平条形图

生成图像如图:

12.3.2 直方图
% 用x所指定的块画直方图,x为一个向量
x=-2.9:0.2:2.9;      % 指定需用的条块
y=randn(5000,1);     % 产生5000个随机数据点
hist(y, x);          % 画直方图 
% 为y向量画n条块直方图,n为标量
n = 30
hist(y, n);          % 画直方图 

生成图像如图:

12.3.3 对数曲线图
x = [1:0.1:30];
y1 = log(x);
y2 = exp(x);
y3 = x;

semilogx(x,y1)     % x轴为对数坐标
semilogy(x,y2)     % y轴为对数坐标
loglog(x,y3)       % x轴、y轴均为对数坐标

生成图像如图(以semilogy(x,y2) 为例):

12.3.4 极坐标图

使用polar(theta,rho) 生成极坐标图

% polar(theta,rho) 
theta = 0:.01:pi;
rho = sin(3*theta).*cos(2*theta);
polar(theta, rho, '-m')

生成图像如图:

12.5 饼图
a=[.5  1  1.6  1.2  0.8  2.1];
pie(a,a==max(a));   %对a作饼图,并抽出最大的切片

生成图像如图:

12.6 其余图形汇总
函数 图形
semilogx(x, y) 绘制x轴为对数标度的图形
semilogy(x, y) 绘制y轴为对数标度的图形
loglog(x, y) 绘制x轴、y轴均为对数标度的图形
area(x, y) 绘制堆叠区域图。图像曲线与x轴围成区域填充,其余等同于plot(x,y)
fill(x(t), y(t), ‘m’) 使用颜色填充多边形,'m’为品红色,可选其他颜色
comet(x, y, 0.5) 绘制彗星图,即显示曲线变化的动图;0.5为曲线移动速率,范围:0~1
pie(a,b) 绘制饼图,a为数值向量,b为可选逻辑向量
pareto(a) 把向量以降序画成条状, 同时画出相应的累积值曲线图
stairs(x, y) 绘制阶梯图。在指定的横坐标x上画出y,其中x值必须是严格递增,且均匀间隔
hist(y, n)
hist(y, x)
为y向量画n条块直方图,n为标量。N省略时画10条块的直方图
用x所指定的块画直方图,x为一个向量
rose(v, n)
rose(v, x)
画角直方图,使用方法类似直方图
stem(x) 绘制离散序列枝干图,用直线把向量x中的数据点连接到横轴上
errorbar() 绘制误差棒状图
compass(z) 从原点绘制罗盘图
feather(z) 绘制羽毛图
12.4 使用fplot分析函数
12.4.1 基本绘图步骤
f = @(x) 2.*exp(-x).*sin(x)   % f = 2.*exp(-x).*sin(x)
fplot(f , [0  8]);   % 在区间 [0,8] 绘制函数
12.4.2 使用函数进行数据分析
%  求最小值
f = @(x) 2.*exp(-x).*sin(x)   % f = 2.*exp(-x).*sin(x)
fplot(f , [0  8]);   % 在区间 [0,8] 绘制函数

xmin = fminbnd(f , 2 , 5)	    % 在[2,5]之间搜寻极小值, xmin = 3.9270
ymin = f(xmin)	        % 当xmin = 3.9270时,y = -2.7864e-02

xmin = fzero(f , 3)  	% 在 3 附近 搜寻零点, xmin = 3.9270
xmin = fzero(f , [2 4])  	% 在 [2 4]区间内 搜寻零点, xmin = 3.9270

13. 三维绘图

13.1 三维曲线图

使用plot3(x, y, z)创建三维曲线图:

t=0: pi/50: 10*pi;
plot3(sin(t),cos(t),t)

title( ' Helix ' ), xlabel( ' sint(t) ' ), ylabel( ' cos(t) ' ), zlabel( ' t ' )
grid on

生成图像如图:

plot3()支持同一张图上绘制多个函数,如:

x=linspace(0,3*pi);

z1=sin(x);
z2=sin(2*x)

y1=zeros(size(x));
y2=ones(size(x));
 
plot3(x,y1,z1, x,y2,z2);

title( ' sin(x),sin(2x) ' ), xlabel( ' x-axis ' ), ylabel( ' y-axis ' ), zlabel( ' z-axis ' )
grid on

生成图像如图:

13.2 三维曲面图

若要创建曲面,则需要使用Meshgrid生成网格:

x=-3: 0.3 :3;   % 选择x轴的值
y=-3: 0.3: 3;    % 选择y轴的值

[X,Y] = meshgrid(x,y);

矩阵X值为:

矩阵Y值为:

13.2.1 使用plot3()创建三维曲面图:
x=-3: 0.3: 3;    % 选择x轴的值
y=-3: 0.3: 3;    % 选择y轴的值

[X,Y] = meshgrid(x,y);

Z = 3*(1-X).^2.*exp(-(X.^2) - (Y+1).^2) - 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2) - 1/3*exp(-(X+1).^2 - Y.^2) ;

plot3(X,Y,Z,'-o' ,X',Y',Z')    % 按列画出plot3(X,Y,Z,'-o'),按行画出plot3(X',Y',Z')

xlabel( ' x-axis ' ),ylabel( ' y-axis ') ,zlabel( ' z-axis ' )
grid on

生成图像如图:

13.2.2 使用mesh()surf()创建三维曲面图:
x=-3: 0.3: 3;    % 选择x轴的值
y=-3: 0.3: 3;    % 选择y轴的值

[X,Y] = meshgrid(x,y);

Z = 3*(1-X).^2.*exp(-(X.^2) - (Y+1).^2) - 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2) - 1/3*exp(-(X+1).^2 - Y.^2) ;

figure
mesh(X,Y,Z)      % 绘制三维曲面图
figure
surf(X,Y,Z)      % 绘制三维曲面图

xlabel( ' x-axis ' ),ylabel( ' y-axis ') ,zlabel( ' z-axis ' )
grid on

生成图像如图(mesh(X,Y,Z)):

生成图像如图(surf(X,Y,Z)):

13.2.3 使用contour()创建等值线图:
% 使用contour()创建等值线图:
x=-3: 0.3: 3;    % 选择x轴的值
y=-3: 0.3: 3;    % 选择y轴的值

[X,Y] = meshgrid(x,y);

Z = 3*(1-X).^2.*exp(-(X.^2) - (Y+1).^2) - 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2) - 1/3*exp(-(X+1).^2 - Y.^2) ;

% contour(X',Y',Z')      % 绘制二维等值线图
contour(X',Y',Z',7)   % 7 指生成7条等值线,缺省时为根据图形自动设置

xlabel( ' x-axis ' ),ylabel( ' y-axis ') ,zlabel( ' z-axis ' )
grid on

% 在图片中添加向量梯度
[dx,dy] = gradient(Z);   % 计算微分梯度
hold on
quiver(x,y,dx,dy)        % 向等高线中添加梯度图

contour(X,Y,Z)生成图像如图左,quiver(x,y,dx,dy)生成图像如图右,

13.2.4 曲面图常见命令及特殊曲面图
%% 生成图像
x=-3: 0.3: 3;    % 选择x轴的值
y=-3: 0.3: 3;    % 选择y轴的值

[X,Y] = meshgrid(x,y);

Z = 3*(1-X).^2.*exp(-(X.^2) - (Y+1).^2) - 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2) - 1/3*exp(-(X+1).^2 - Y.^2) ;

%% 以下为mesh(X,Y,Z)命令
mesh(X,Y,Z)         % 绘制三维曲面图
hidden off          % 使白色网格透明,使用 hidden on 取消

meshc(X,Y,Z)        % 绘制三维曲面图+等值线
meshz(X,Y,Z)        % 绘制三维曲面图+高度

%% 以下为surf(X,Y,Z)命令
surf(X,Y,Z)         % 绘制三维曲面图

shading faceted     % 保留各块黑线,每一补片单一色彩
shading flat        % 去掉各块黑线,每一补片单一色彩
shading interp      % 去掉各块黑线,每一补片插值色彩

colormap parula     % 更改三维曲面图填充颜色,默认parula配色,其他配色如下(越往后配色越奇怪)
% 颜色有:parula、turbo、hsv、jet、hot、cool、spring、summer、autumn、winter、gray、bone、copper、pink等

surfc(X,Y,Z)        % 绘制三维曲面图+等值线
surfl(X,Y,Z)        % 绘制有亮度的三维曲面图
surfnorm(X,Y,Z)     % 绘制三维曲面图+曲面法线

%% 以下为contour(X,Y,Z)命令
contour(X,Y,Z)      % 绘制二维等值线图
contour3(X,Y,Z)     % 绘制三维等值线图

pcolor(X,Y,Z)       % 等效于surf(X,Y,Z)沿z轴垂直投影图
contourf(X,Y,Z)     % 绘制二维等值线图,相邻的等值线之间用同一颜色进行填充

clabel()            % 标记等高线,使用语法为:a=contour(X,Y,Z); clabel(a)

[DX,DY]=gradient(Z,0.2,0.2);   % 数值梯度,各方向步长
quiver(X,Y,DX,DY)              % 绘制等值线的速度梯度

%% 不规则绘图
% Griddata 产生经插值后的均匀间隔数据来作图
ZI=griddata(X,Y,Z,XI,YI);    % X,Y为插值前数据;XI,YI为插值后数据
% 生成丝带状三维图
ribbon(x,y,z);
% 绘制彗星图
comet3(x,y,z)
% 绘制三维离散数据序列
stem3(x,y,z)

%% 绘图命令
xlabel( ' x-axis ' ),ylabel( ' y-axis ') ,zlabel( ' z-axis ' )
grid on

14. 语法结构

14.1 判断
14.1.1 if…elseif…else…end

使用方法类似C语言语法,详细使用方法可参照C语言语法讲解

a = 100;
if(a == 1)
	% 执行分支语句 
elseif(a == 20)
	% 执行分支语句 
elseif a == 30       % if后面的()可以不加
	% 执行分支语句 
else                 % 上述情况均不满足
	% 执行分支语句 
end                  % 注意 switch 需要以 end 进行结尾

% 注意:if语句可以嵌套
14.1.2 switch…case…otherwise…end

使用方法类似C语言语法,详细使用方法可参照C语言语法讲解;
注意与C语言不同一点,matlab中 switch…case ,不需要break退出

grade = 10;          % grade 可以是 数字 或者 字母、字符串
switch(grade)
case(2)
	% 执行分支语句 
case 4               % switch和case后面的()可以不加
	% 执行分支语句 
case (10) 
	% 执行分支语句 
case 17
	% 执行分支语句    
otherwise            % 上述情况均不满足
	% 执行分支语句 
end                  % 注意 switch 需要以 end 进行结尾
14.2 循环
14.2.1 for…end 循环

for 循环的值有下述三种形式之一:

格式 描述
initval: endval 索引变量从初始到终值递增1,重复执行程序语句,直到索引值大于终值。
initval: step: endval 按每次迭代中的值步骤递增索引, 或在步骤为负值时递减。
valArray 在每个迭代 valArray 数组的后续列中创建列向量索引。
例如, 在第一次迭代中, index = valArray (:, 1),循环执行最大 n 次, 其中 n 是 valArray 的列数

for循环其他使用方法类似C语言,详细使用方法可参照C语言语法讲解;

for a = 2:20 
	% 执行循环语句,重复执行19次
end

for(a = 10: -1: 0)         % for 后面可以加()
	% 执行循环语句,重复执行11次
end

% 注意:for语句可以嵌套
14.2.2 while…end 循环

使用方法类似C语言语法,详细使用方法可参照C语言语法讲解;

while( bool )         % while 后面的()可以不加
	% 执行循环语句,直到while内bool表达式为假
end
14.2.3 循环控制语言(break,continue)

breakcomtinue使用方法类似C语言语法,详细使用方法可参照C语言语法讲解;
break 语句用于终止 for 或 while 循环的执行,comtinue 语句用于跳过某次循环
二者常与 if 配合使用

a = 9;
while a < 19
  a=a+1;
  if a == 15
    % 跳过本次循环
    continue;
  end
  disp(a);
end
% 10 11 12 13 14   16 17 18 19 

15. 函数

函数是一组语句一起执行任务。在MATLAB中,函数定义在单独的文件,文件函数的名称应该是相同的。

15.1 基础语法:
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
% 函数的第一行要以 function 关键字开始,函数名称为myfun()
% 函数传入参数为 in1,in2,in3, ..., inN ,函数返回值为 out1,out2, ..., outN
end  % 表示函数结束

% 无返回值
% function myfun(in1,in2,in3, ..., inN)
% 单返回值
% function out = myfun(in1,in2,in3, ..., inN)
% 无传入值
% function [out1,out2, ..., outN] = myfun
% function [out1,out2, ..., outN] = myfun()   也可

示例:

% 主文件:
values = [12.7, 45.4, 98.9, 26.6, 53.1];
[ave,stdev] = stat(values)  % 返回均值,方差   % ave = 47.3400   % stdev = 29.4124
average = stat(values)   % 仅返回均值   % average = 47.3400

% 函数文件
function [m,s] = stat(x)
    n = length(x);   % 获得向量长度
    m = sum(x)/n;    % 求向量均值
    s = sqrt(sum((x-m).^2/n));  % 求向量方差
end
15.2 函数文件定义多个函数

在名为 stat2.m 的文件中定义两个函数,其中第一个函数stat2调用第二个函数avg

function [m,s] = stat2(x)
    n = length(x);
    m = avg(x,n);
    s = sqrt(sum((x-m).^2/n));
end

function m = avg(x,n)
    m = sum(x)/n;
end

类似于 C语言 的 静态函数

15.3 在脚本文件中定义函数(匿名函数)

匿名函数可以接受多个输入并返回一个输出。它们可能只包含一个可执行语句。

%% 语法
% f = @(arglist)expression 
% 变量 expression 是一个函数句柄或者函数表达式,@ 运算符创建句柄,@ 运算符后面的圆括号 () 包括函数的输入参数。

% 直接构造匿名函数
x = 0:0.1:1;         % 0 0.1 0.2 …… 1.0
xmin = 0;
xmax = pi;
f = @(x) sin(x).^3;  % 直接构造函数
result = f(x)        % 0 0.0010 0.0078 …… 0.5958
a = integral(f,xmin,xmax)  % 在 xmin 至 xmax 区间 求函数 fun 数值积分

% 匿名函数指向函数句柄
x = 0:0.1:1;        % 0 0.1 0.2 …… 1.0
xmin = 0;
xmax = pi;
f = @myIntegrand;   % 指向句柄时不需要传参
result = f(x);      %  0 0.0010 0.0078 …… 0.5958
a = integral(f,xmin,xmax)  % 在 xmin 至 xmax 区间 求函数 fun 数值积分

% 注意在脚本文件中定义函数,函数必须在程序末尾
function y = myIntegrand(x)
    y = sin(x).^3;
end
15.4 MATLAB全局变量

全局变量可以共享由一个以上的函数。

% 设置全局变量函数
function setGlobalx(val)
    global GLO_X
    GLO_X = val;
end

% 获得全局变量函数
function res = getGlobalx
    global GLO_X
    res = GLO_X;
end

% 工作区
setGlobalx(1138);   % 设置变量x的值
res = getGlobalx;     % 获得变量x的值

global GLO_X   % 直接声明全局变量,此时可以对其进行使用

16. 代数

16.1 在MATLAB解决基本的代数方程组

解方程组的基本方法solve

% 注意:旧版本,代数方程组需要 + ' 单引号 '

%% 
% 解方程组基本用法
syms x   % 定义a b c x为系统变量
S = solve(x^2 - 3*x + 2 == 0);   % 解:1 2
% 注意旧版本需要'',新版本不支持此语法
% S = solve('x^2 - 3*x + 2 == 0');   % 解:1 2

% 解高次方程
syms x   % 定义a b c x为系统变量
S = solve(x^5 == 3125);   
% 解:
%                                                          5
% - (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4
%   (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4
%   (5*5^(1/2))/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4
%   (5*5^(1/2))/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4


%%
% 解代数高次方程
syms a b c x   % 定义a b c x为系统变量
eqn = a*x^2 + b*x + c == 0;   % 方程为:a*x^2 + b*x + c == 0
S = solve(eqn);  % 求解方程,系统默认变量为x,返回值放入S
% 省略中间步骤
syms a b c x   % 定义a b c x为系统变量
solve(a*x^2 + b*x + c == 0);
% 解:-(b + (b^2 - 4*a*c)^(1/2))/(2*a)   -(b - (b^2 - 4*a*c)^(1/2))/(2*a)

% 修改方程变量
syms a b c x   % 定义a b c x为系统变量
eqn = a*x^2 + b*x + c == 0;   % 方程为:a*x^2 + b*x + c == 0
Sa = solve(eqn,a);  % 求解方程,设置系统变量为a
% 省略中间步骤
syms a b c x   % 定义a b c x为系统变量
solve(a*x^2 + b*x + c == 0, a);
% 解:-(c + b*x)/x^2


%%
% 特殊函数方程
syms x
eqn = sin(x) == x^2 - 1;
S = solve(eqn,x);  % -0.63673
% 省略中间步骤
syms x
solve(sin(x) == x^2 - 1);
% 解特殊函数方程时,solve函数等价于vpasolve函数,上式等价于:
V = vpasolve(eqn,x,[0 2])    % 求方程在[0 , 2]区间内的解
% 注意:此函数仅返回一个解


%% 
% 解多元方程
% 多元线性方程组,可以直接使用 矩阵 求解
syms u v
eqns = [2*u + v == 0, u - v == 1];
S = solve(eqns,[u v]);    % u=1/3, v=-2/3
S.u; % u= 1/3
S.v; % v=-2/3

% 多元非线性方程,可以直接使用 solve 求解
syms x y z
eqns = [x^2 + sqrt(5)*x == -1, x + 3*z^2 == 4, y*z + 1 == 0];
S = solve(eqns,[x y z]);    % u=1/3, v=-2/3
S.x; 
S.y; 
S.z; 
% x =
% - 5^(1/2)/2 - 1/2
% - 5^(1/2)/2 - 1/2
%   1/2 - 5^(1/2)/2
%   1/2 - 5^(1/2)/2

% 上式也可以这样写
% 多元非线性方程,可以直接使用 solve 求解
syms x y z
eq1  = x^2 + sqrt(5)*x == -1;
eq2  = x + 3*z^2 == 4;
eq3  = y*z + 1 == 0;
eqns = [eq1, eq2, eq3];
S = solve(eqns,[x y z])   
S.x
S.y 
S.z 

% 上式还可以这样写
syms x y z
eqns = [x^2 + sqrt(5)*x == -1, x + 3*z^2 == 4, y*z + 1 == 0];
[solx, soly, solz] = solve(eqns,[x y z]);    
% solx = S.x;   soly = S.y;   solz = S.z; 
solutions = [solx soly solz]
% solutions即为上面解横向拼接
% [- 5^(1/2)/2 - 1/2,     (3*((2*5^(1/2))/3 + 6)^(1/2)*(5^(1/2) + 7))/(4*(4*5^(1/2) + 17)),    -((2*5^(1/2))/3 + 6)^(1/2)/2]
% [- 5^(1/2)/2 - 1/2,    -(3*((2*5^(1/2))/3 + 6)^(1/2)*(5^(1/2) + 7))/(4*(4*5^(1/2) + 17)),     ((2*5^(1/2))/3 + 6)^(1/2)/2]
% [  1/2 - 5^(1/2)/2,  (3*((2*5^(1/2))/3 + 14/3)^(1/2)*(5^(1/2) + 9))/(4*(4*5^(1/2) + 17)), -((2*5^(1/2))/3 + 14/3)^(1/2)/2]
% [  1/2 - 5^(1/2)/2, -(3*((2*5^(1/2))/3 + 14/3)^(1/2)*(5^(1/2) + 9))/(4*(4*5^(1/2) + 17)),  ((2*5^(1/2))/3 + 14/3)^(1/2)/2]

%%
% 解不等式
syms x y
eqn1 = x > 0;
eqn2 = y > 0;
eqn3 = x^2 + y^2 + x*y < 1;
eqns = [eqn1 eqn2 eqn3];

S = solve(eqns,[x y],'ReturnConditions',true);  % ReturnConditions表示返回解决方案中的任何参数和解决方案上的条件
S.x           % (- 3*v^2 + u)^(1/2)/2 - v/2
S.y           % v
S.parameters  % [u, v]
S.conditions  % 4*v^2 < u & u < 4 & 0 < v


%% 求解周期函数
% 并不返回全部解,而是返回使用解
syms x
eqn = sin(x) + cos(2*x) == 1;
S = solve(eqn,x)
% 0   pi/6  (5*pi)/6   
% 此时只返回一个解
S1 = solve(eqn,x,'PrincipalValue',true)
% 0
[solx,parameters,conditions] = solve(eqn,x,'ReturnConditions',true)
% solx = pi*k   pi/6 + 2*pi*k    (5*pi)/6 + 2*pi*k
% parameters = k
% conditions = in(k, 'integer')   in(k, 'integer')   in(k, 'integer')
% 意思是:参数为k,k范围任意整数

%% 求解变量的函数
syms x y z
exp1 = [x^2/9 + y^2/4 + z^2 == 1, 2*x - 3*y == 0];    % 3未知数,2方程
s = solve(exp1, [x, y]'ReturnConditions', true);   
s.x    % x y 解为 z 的函数
%  (3*2^(1/2)*(-(z - 1)*(z + 1))^(1/2))/2
% -(3*2^(1/2)*(-(z - 1)*(z + 1))^(1/2))/2
s.parameters   
ans =
% Empty sym: 1-by-0
s.conditions  
% symtrue
% symtrue


%% condition
solve(eqns,vars,'Real',true)              % 仅返回实数解
solve(eqns,vars,'IgnoreAnalyticConstraints',true)    % 先化简在求解
% 诸如:log(ab)=log(a)+log(b), e^a * e^b = e^(a+b)   等等化简
solve(eqns,vars,'PrincipalValue',true)    % 仅返回一个值
solve(eqns,vars, 'MaxDegree', 3)          
% 尝试获得此类方程的显式解,主要解决如下同时求解出root(z)情况,
% 尝试返回显式解的多项式的最大次数,默认值为2,这里设置为3

%% 可以使用assume()确定符号变量的性质
assume(x,'real')        % 实数
assume(x,'rational')    % 有理数
assume(x,'positive')    % 正数
assume(x,'integer')     % 整数
assume(x/2,'integer')   % 偶数
assume((x-1)/2,'integer')   % 奇数
assume(x<-1 | x>1)      % 小于-1或者大于1的数
assume(x,'clear')       % 清楚之前的假设
assume(x ~= 0)          % 不等于0的数

使用fsolve求解方程:(对非线性方程组进行数值求解)

% 对非线性方程组进行数值求解,只能求解匿名函数
% 基本用法
fun = @root2d;  % 指向函数句柄
x0 = [0,0];     % 从 [0,0] 点开始求解方程组
x = fsolve(fun,x0)   % x =   0.353246561920553   0.606082026502285

function F = root2d(x)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
% 等价于 syms x1 x2
% 等价于 exp(-exp(-(x1+x2))) - x2*(1+x1^2) == 0
% 等价于 x1*cos(x2) + x2*sin(x1) - 0.5 == 0
end

F = @(x) [2*x(1) - x(2) - exp(-x(1));
         -x(1) + 2*x(2) - exp(-x(2))];
x0 = [-5;-5];
[x,fval] = fsolve(F,x0)  
% x = 0.567143031397357    0.567143031397357
% fval = 1.0e-06 * -0.405909605705190     1.0e-06 * -0.405909605705190
% fval是指误差,
% 2*x(1) - x(2) - exp(-x(1)) = 1.0e-06 * -0.405909605705190
% -x(1) + 2*x(2) - exp(-x(2)) = 1.0e-06 * -0.405909605705190

% 求解矩阵方程
fun = @(x)x*x*x - [1,2;3,4];   % 矩阵X,X*X*X = [1,2;3,4]
X0 = ones(2);
X = fsolve(fun,X0)   % X = [-0.1291489 , 0.860216 ; 1.290324 , 1.1611747]

使用vpasolve求解方程:

% 注意,使用vpasolve求解,虽然称之为“数值解”,但数据类型依然是符号变量
% solve求解数值解时,自动调用vpasolve
syms x
eqn = sin(x) == x^2 - 1;
V = vpasolve(eqn,x,[0 2])    % 求方程在[0 , 2]区间内的解 V=1.409624

syms x
eqn = sin(x) == x^2 - 1;
V = vpasolve(eqn,x,1)        % 求方程在1附近的解 V=1.409624

syms x y
eqn1 = exp(-x^2-y^2)*(x-4) - exp((-x^2-y^2)/2)*(x-2) == 0;
eqn2 = exp(-x^2-y^2)*(y-2) - exp((-x^2-y^2)/2)*(y-4) == 0;
[solX, solY] = vpasolve([eqn1 eqn2],[x y]); % Empty sym: 0-by-1 方程组无解
[solX, solY] = vpasolve([eqn1 eqn2],[x y],[2; 4])   % 假设x在2附近,y在4附近 
% solX = 1.9999092125057125429174334656647
% solY = 4.0000907874942874570825665343353

使用fzero求解方程:
见:12.4 使用函数进行数据分析;

使用roots求解方程:
见:16.2.3 多项式的根

更多:如何解决MATLAB的solve函数求方程时出现未知数z和root?

syms x y
[x,y]=solve((x-2)^2+(y+2*x-3)^2==5,2*(x-3)^2+(y/ 3)^2==4 )

% y = 
%  root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 1)
%  root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 2)
%  root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 3)
%  root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 4)
% x 也一样

x = vpa(x)
y = vpa(y)
% y =
%   1.8936365963298548025994430021814
%  -2.6929074352940121705044040780427
%  -4.1171266000258712039597783906018
%   -5.639401248099686964240293356294

x = double(x)
y = double(y)
% y =
%     1.8936
%    -2.6929
%    -4.1171
%    -5.6394

%% 也可以使用solve(eqns,vars, 'MaxDegree', 3)最大调度方法求解 

%% 补充 vpa()函数说明
% 将符号变量计算为至少d个有效数字,默认值d为32
syms x
p = sym(pi);
a = sym(1/3);
f = a*sin(2*p*x)
% f = sin(2*pi*x)/3
fVpa = vpa(f)
% fVpa = 0.33333333333333333333333333333333*sin(6.283185307179586476925286766559*x)
16.1.1 求函数零点、极值点

详见:12.4 使用函数进行数据分析

16.2 多项式
16.2.0 多项式计算
%% 计算方法
p = [3 2 1];   % 多项式:3.*x.^2 + 2.*x + 1
x = [5 7 9];   
y = polyval(p,x)  % 计算 多项式p 在点 [5 7 9] 上的值
16.2.1 多项式曲线拟合
% 注意此方法本质上是对散点进行拟合,为曲线拟合内容;
% 而不是完全的函数逼近;
x = linspace(0,4*pi,50);
y1 = sin(x);   % 在区间 [0,4*pi] 中沿正弦曲线生成 50 个等间距的点。
p = polyfit(x,y1,7);   % 使用 polyfit 将一个 7 次多项式与这些点拟合。
% 返回值为多项式系数:-0.0001    0.0024   -0.0404    0.3184   -1.1504    1.4234    0.2215    0.0684
% 即:-0.0001.*x.^7 + 0.0024.*x.^6 + -0.0404.*x.^5 + 0.3184.*x.^4 + -1.1504.*x.^3 + 1.4234.*x.^2 + 0.2215.*x.^1 + 0.0684
y2 = polyval(p,x);  % 计算 多项式p 在点 x 上的值
plot(x,y1,x,y2);

绘制其图像为:

16.2.2 多项式曲线插值
%% 一般插值方法
x = 0:pi/4:2*pi;  
v = sin(x);        
xq = 0:pi/16:2*pi;   
vq1 = interp1(x,v,xq);    % 向量 x 包含样本点,v 包含对应值 v(x)。向量 xq 包含查询点的坐标。
% vq1 = interp1(x,v,xq,'spline');  % 表示使用'spline'插值方法
% vq1 = interp1(x,v,xq,'nearest');  % 表示使用'nearest'插值方法
% vq1 = interp1(x,v,xq,'cubic');  % 表示使用'cubic'插值方法
% 插值方法有:'linear'、'nearest'、'next'、'previous'、'pchip'、'cubic'、'v5cubic'、'makima' 或 'spline'。
% 默认方法为 'linear'
plot(x,v,'o',xq,vq1,':.');

%% 三次样条插值
x = 0:pi/4:2*pi;  
v = sin(x);        
xq = 0:pi/16:2*pi;   
vq1 = spline(x,v,xq);    % 三次样条插值
plot(x,v,'o',xq,vq1,':.');
% 也可以这样使用
pp = spline(x,v);    % 三次样条插值,返回为pp插值对象
yi=ppval(pp, xq);    % 使用pp插值对象对xq数据进行插值

分别绘制图像:‘linear’、‘spline’、‘nearest’、‘cubic’

三次样条插值:

16.2.3 多项式的根
% 求方程 3.*x.^2 - 2.*x -4 = 0 的解
p = [3 -2 -4];   
r = roots(p);   % 1.5352; -0.8685

% 求方程 x.^4 - 1 = 0 的解
p = [1 0 0 0 -1];   
r = roots(p);   % -1 ; 1 ; i ; -i
16.2.4 多项式乘法(卷积)
% 求多项式 x.^2 + 1 和 2.^x +7 相乘
u = [1 0 1];
v = [2 7];
w = conv(u,v);   % 2   7   2   7   % 2.*x.^3 + 7.*x.^2 + 2.*x + 7
16.2.5 多项式除法(逆卷积)
% 求多项式 2.*x.^3 + 7.*x.^2 + 4.*x + 9 和 1.*x.^2 + 1 相除
u = [2 7 4 9];
v = [1 0 1];
[q,r] = deconv(u,v);  % q:2  7   p:0  0  2  2
% u = 2.*x + 7 + (1.*x.^2 + 1) * (2.*x + 2)
16.2.6 多项式积分
%% 不定积分
p = [3 0 -4 10 -25];  % 多项式 3.*x.^4 - 4.*x.^2 + 10.*x - 25 
q = polyint(p);   %  0.6000   0   -1.3333   5.0000   -25.0000   0
% 即 p 的不定积分为 q  0.6.*x.^5 - 1.3333.*x.^3 + 5.*x.^2 - 25.*x 
% 上述积分默认积分常数C为0,若积分常数C不为0,则使用:
% q = polyint(p, 3);  % 积分常数 C = 3

%% 定积分
a = -1;   % 积分下限为 -1
b = 3;    % 积分上限为 3
I = diff(polyval(q,[a b]));   % 求解 p 在区间 -1~+3 的定积分值,I = 49.0667
16.2.7 多项式微分
%% 直接求解
p = [3 0 -2 0 1 5];  % 多项式 3.*x.^5 - 2.*x.^3 + x + 5 
q = polyder(p);    % 15   0   -6   0   1  
% 即 p 的微分为 q   15.*x.^4 - 6.*x.^2 + 1

%% 多项式相乘
a = [1 -2 0 0 11];
b = [1 -10 15];
q = polyder(a,b);  % 6   -60   140   -90   22   -110
% 即 p 的微分为 q   6.*x.^5 - 60.*x.^4 + 140.*x.^3 - 90.*x.^2 + 22.*x -110

%% 多项式相除
p = [1 0 -3 0 -1];
v = [1 4];
[q,d] = polyder(p,v);  % q:3  16  -3  -24  1    p:1  8  16
% 即 p 的微分为 q   
%   3.*x.^4 - 16.*x.^3 - 3.*x.^2 - 24.*x  + 1
% —————————————————————————————————————————————
%           1.*x.^2 + 8.*x  + 16
16.3 MATLAB求解微积分
16.3.1 求极限
%% 
% 基础用法
syms x
limit((x^3 + 5)/(x^4 + 7));   % 求当x→0,(x^3 + 5)/(x^4 + 7)的值,  % 5/7 

syms x h
f = sin(x)/x; 
limit(f,x,0);  % x作为变量,求当x→0,sin(x)/x的值,  % 1

f = (sin(x+h)-sin(x))/h;
limit(f,h,0);  % h作为变量,求当h→0,(sin(x+h)-sin(x))/h的值,  % cos(x)

syms x
f = 1/x;
limit(f,x,0,'right');   % 求左极限,Inf
limit(f,x,0,'left');    % 求右极限,-Inf
16.3.2 数值积分

数值积分使用 integral 函数

%% 
fun = @(x) exp(-x.^2).*log(x).^2;  % 构造匿名函数
q = integral(fun,0,Inf);  % 计算 x=0 至 x=Inf 的积分  % q = 1.9475

%% 二重积分
fun = @(x,y) 1./( sqrt(x + y) .* (1 + x + y).^2 );
q = integral2(fun,0,1,0,1);

使用梯形法求近似积分

%% 
fun = @(x) exp(-x.^2).*log(x).^2;  % 构造匿名函数
x=1 : 0.05 : 2;	  
y = fun(x);
area=trapz(x, y);  % 区间 [1 2],通过0.05等分;等分后每个小区间计算其梯形面积,近似作为其积分  
% 近似解1.1851e-02,标准解1.1856e-02
16.3.3 数值微分
%% 1. 计算差分
% Y = diff(X) 
% 即 Y = [X(2)-X(1) X(3)-X(2) ... X(m)-X(m-1)]  或  Y = [X(2,:)-X(1,:); X(3,:)-X(2,:); ... X(p,:)-X(p-1,:)]
X = [0 5 15 30 50 75 105]; 
Y = diff(X)     % 计算一阶差分  % 5   10   15   20   25   30
Y = diff(X,2)   % 计算二阶差分  % 5   5   5   5   5

X = [1 3 5;7 11 13;17 19 23];
Y = diff(X)     % 计算矩阵差分  % 6   8   8 ; 10   8   10
Y = diff(X,1,2) % 按列计算矩阵差分  % 2 2 ; 4 2 ; 2 4

%% 2. 使用差分求导数近似值
h = 0.001;       % 步长
X = -pi:h:pi;    % 作用域
f = sin(X);      % 函数
Y = diff(f)/h;   % 一阶导数
Z = diff(Y)/h;   % 二阶导数

%% 由于使用diff()函数,计算的差分少一项,因此,可以设置第一项(或最后一项)为0,理解为向前/向后差分
X = [0 5 15 30 50 75 105]; 
Y = [0, diff(X)]     % 计算一阶差分  % 0   5   10   15   20   25   30
Y = [diff(X), 0]     % 计算一阶差分  % 5   10   15   20   25   30   0
% 如果要求导数,可以设置 第一项(或最后一项) 等于差分的第一项(或最后一项)
h = 0.001;       % 步长
X = -pi:h:pi;    % 作用域
f = sin(X);      % 函数
Y = diff(f)/h;   % 一阶导数
Y = [Y(1) Y];    % 假定数值微分初始值
plot(X,f, X,Y);
legend('sin(x)', 'cos(x)');
% 图像绘制如下

%% 3. 直接使用梯度计算微分
% Y = gradient(X);
% 即 Y = [ (X(2)-X(1))/1 , (X(3)-X(1))/2 , (X(4)-X(2))/2 , ... , (X(m)-X(m-2))/2 , (X(m)-X(m-1))/1 ]
% Y = gradient(X, h);
% 即 Y = [ (X(2)-X(1))/h , (X(3)-X(1))/2h , (X(4)-X(2))/2h , ... , (X(m)-X(m-2))/2h , (X(m)-X(m-1))/h ]
Y  = [0 5 15 30 50 75 105]; 
dY = gradient(Y)   % 5 7.5 12.5 17.5 22.5 27.5 30
Y  = [0 5 15 30 50 75 105]; 
dY = gradient(Y, 0.1)   % 0.5 0.75 1.25 1.75 2.25 2.75 3
% 应用举例:
h = 0.001;       % 步长
X = -pi:h:pi;    % 作用域
f = sin(X);      % 函数
Y = gradient(f, h); % 一阶导数
plot(X,f, X,Y);
legend('sin(x)', 'cos(x)');

使用diffgradient计算微分结果如图所示

16.4 MATLAB求解微分方程
16.4.1 求微分方程的解析解

旧版本写法:
dsolve(‘方程1’,‘方程2’,…,‘方程n’,‘初始条件’,‘自变量’)
初始条件省缺时,是求微分方程的通解。
Dy代表y的导数,D2y代表y的二阶导数, D3y代表y的三阶导数……

新版本写法:
将字符声明为系统变量,使用diff(y,x)作为微分变量

**e.p1:**基本用法:img

% 旧版本
y=dsolve('D2y+2*Dy+y-x^2=0','x')

% 新版本
syms y(x)    % y, x声明为系统变量;表示 y对x 求解
eqn = diff(y,x,2) + 2*diff(y,x) + y - x.*x == 0;
y = dsolve(eqn)
% 这样写也可以
syms y(x)    
y = dsolve(diff(y,x,2) + 2*diff(y,x) + y - x.*x == 0)

% 以上求解得: 以上求解得: y = x^2 - 4*x + C1*exp(-x) + C2*x*exp(-x) + 6

**e.p2:**dy / da = ty

% 旧版本
y=dsolve('Dy=t*y','a')

% 新版本
syms y(a) t  % 这里表示对a求微分方程通解
eqn = diff(y,a) == t*y;
y = dsolve(eqn)

% 以上求解得: y = C1*exp(a*t)

**e.p3:**高阶微分方程:img

% 旧版本
y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x')

% 新版本
syms y(x)    % y, x声明为系统变量
eqn = diff(y,x,2) + 4*diff(y,x) + 29*y == 0;
Dy = diff(y,x);
cond = [y(0)==0 , Dy(0)==15];
y = dsolve(eqn,cond)
% 这样写也可以
syms y(x)    % y, x声明为系统变量
Dy = diff(y,x);
y = dsolve(diff(y,x,2) + 4*diff(y,x) + 29*y == 0 , [y(0)==0 , Dy(0)==15])

% 以上求解得: y = 3*sin(5*x)*exp(-2*x)

**e.p4:**微分方程组:img

% 旧版本
eq1='Dx=2*x-3*y+3*z';
eq2='Dy=4*x-5*y+3*z';
eq3='Dz=4*x-4*y+2*z';
[x,y,z]=dsolve(eq1,eq2,eq3,'x(0)=1,y(0)=2,z(0)=1');   %如果省略自变量,默认为t

% 新版本
syms x(t) y(t) z(t)
eqns = [diff(x,t) == 2*x-3*y+3*z, diff(y,t) == 4*x-5*y+3*z, diff(z,t) == 4*x-4*y+2*z];
cond = [x(0)==1 , y(0)==2 , z(0)==1 ];

S = dsolve(eqns , cond);
x = S.x
y = S.y
z = S.z

% 以上求解得:
% x = exp(-t);   y = exp(-t) + exp(-2*t);   z =exp(-2*t);
16.4.2 求微分方程数值解

多数微分方程是没有解析解的,主要依靠数值解法来解决!求数值解的方法有欧拉法、龙格-库塔法等。详细见表格:
img
微分方程需要为:img形式

**e.p.1:**基本用法: img

f=@(x, y) 1./(1+x.^2)-2*y.^2 ;   % 创建匿名函数
[x,y] = ode23(f, [0, 6], 0);     % 微分方程组求解区间为 0~6,y初始值为0
plot(x,y,'-o');

f=@(x, y) 1./(1+x.^2)-2*y.^2 ;
[x,y] = ode45(f, [0, 6], 0);
plot(x,y,'-o');

f=@(x, y) 1./(1+x.^2)-2*y.^2 ;
[x,y] = ode23s(f, [0, 6], 0);
plot(x,y,'-o');

绘制图像分别为:
w1w1w3

**e.p.2:**微分方程组 img

f = @fun;     % 创建匿名函数
[t, x] = ode45(f,[0,30],[1,0.5]);     % 微分方程组求解区间为 0~30,x,y初始值分别为1,0.5

plot(t, x(:,1), t, x(:,2),'linewidth',1.5);   % 分别绘制x、y随t变化图像
legend('x(t)', 'y(t)');
figure(2);
plot(x(:,1), x(:,2), 'linewidth',1.5);        % 绘制y随x变化图像
 
function res=fun(t, x)
    res = zeros(2,1);
    res(1)=-x(1).^3-x(2);
    res(2)=-x(2).^3+x(1);
end

w1w1

**e.p.3:**高阶微分方程必须等价的变换成一阶微分方程组,然后求解:
img,设 y1=y , y2=y’=y1’ , y2’=y’',问题转换为:img

f = @fun;     % 创建匿名函数
[x, y]=ode15s(f,[0,3000],[2,0]);    % 微分方程组求解区间为 0~3000,x,y初始值分别为2,0
plot(x, y(:,1))

function res=fun(x,y)
    res = zeros(2,1);
    res(1)=y(2);
    res(2)=1000*(1-y(1)^2)*y(2)-y(1);
end

绘制图像为:w1

16.5 数值变换
16.5.1 拉普拉斯变换
%% 拉普拉斯变换
syms x b
laplace(x)             % 1/s^2
laplace(x^2)           % 2/s^3
laplace(exp(-b*x))     % 1/(b + s)
laplace(sin(b*x))      % b/(b^2 + s^2)

%% 拉普拉斯逆变换
syms s b
ilaplace(1/s^3)        % t^2/2
ilaplace(s/(s^2+4))    % cos(2*t)
ilaplace(2/(b+s))      % 2*exp(-b*t)
16.5.2 傅里叶变换

1. 傅里叶正变换

Matlab命令:fourier
fourier(f,w)——返回的傅里叶变换以w为默认变量,即求公式2

例:计算 公式2 的傅里叶变换。

%% 傅里叶变换
syms x w
f = exp(-x^2);  % 函数
FT = fourier(f)	% 傅里叶变换   % FT = fourier(f,w)   % 返回傅里叶变换以w为默认变量
% 结果为:pi^(1/2)*exp(-w^2/4)

2. 傅里叶逆变换

Matlab命令:ifourier
ifourier(f,u)——返回的傅里叶逆变换以x为默认变量,即求公式4

例:计算 公式2 的傅里叶逆变换。

syms w x
FT=exp(-w^2/4);
f=ifourier(FT)   % 傅里叶逆变换   % f = ifourier(FT,x)   % 返回傅里叶逆变换以x为默认变量
% 结果为:exp(-x^2)/pi^(1/2)

3. 快速傅里叶变换

%% 信号
t_s = 0.01;    %采样周期
t_start = 0.5; %起始时间
t_end = 5;     %结束时间
t = t_start : t_s : t_end;  % 生成变换数据,总共451个数据
y = 0.7*sin(2*pi*50*t)+sin(2*pi*120*t)+randn(1,length(t));  %生成信号

subplot(5,1,1);
plot(t,y);
title('original signal');   %绘制原始信号图

%%  频谱
y_f = fft(y); %快速傅里叶变换
Druation = t_end - t_start;   %计算采样时间
Sampling_points = Druation/t_s +1;  %采样点数,451,fft后的点数就是这个数
f_s = 1/t_s; %采样频率
f_x = 0: f_s/(Sampling_points -1) :f_s;  %与横坐标频率对应,频率分辨率就是f_s/(Sampling_points -1)
t2 = f_x-f_s/2;

subplot(5,1,2);
plot(f_x , abs(y_f)); 
title('fft transform');

shift_f = abs(fftshift(y_f));  % fftshift() 将零频分量移到频谱中心
subplot(5,1,3);
plot(f_x-f_s/2 , shift_f);
title('shift fft transform');  %将0频率分量移到坐标中心

subplot(5,1,4);
plot(t2(length(t2)/2:length(t2)) , shift_f(length(shift_f)/2:length(shift_f)));
title('shift fft transform');   %保留正频率部分

subplot(5,1,5);
plot(f_x(1:length(f_x)/2) , abs(y_f(1:length(f_x)/2)));
title('fft cut');  %直接截取fft结果的前半部分

生成图像为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mhjFkmE-1691587022572)(D:\Data\我的项目&比赛&兴趣自学内容\知识汇总\知识汇总用到的相关资料\MATLAB 图片截屏\fourier.png)]

17. 更多知识参照MATLAB官方参考文档 (重要,必看)

中文版网址:https://ww2.mathworks.cn/help/matlab/index.html,里面包含MATLAB所有语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DD4ko0cM-1691587022574)(.\MATLAB 图片截屏\new1.png)]

帮助文档使用方法(基于个人经验总结):

1)学习:逐个模块学习即可。事实上,绝大多数MATLAB书籍,就是官方参考文档的翻译及摘录。

2)索引:想实现相关功能,只需在帮助中心搜索即可。
如:搜索积分,可搜索到各种积分方法:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uCProkyt-1691587022574)(.\MATLAB 图片截屏\new2.png)]

搜索傅里叶变换,如下:傅里叶变换、离散傅里叶变换、快速傅里叶变换等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wu14izbE-1691587022575)(D:\Data\我的项目&比赛&兴趣自学内容\知识汇总\知识汇总用到的相关资料\MATLAB 图片截屏\new3.png)]

3)F1快捷键
实际编程时,遇到陌生函数,按F1快捷键,则立即跳转至函数相关文档。
如:plot()函数,假设不知其如何使用,按F1快捷键,立即弹出其函数注解,包含其语法,说明,使用实例等等。

PS:直接在命令行输入 help plot,也可以跳转帮助文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FU01X8OS-1691587022575)(.\MATLAB 图片截屏\new4.png)]

你可能感兴趣的:(matlab,开发语言)