MATLAB基础语法总结

2023-11-18

主体参照:全网最全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

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)

生成图像如图:
115

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 以当前坐标轴范围为基础,将坐标轴区域调整为方格形

生成图像如图:
2

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 六角形 标记点
* * 标记点

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

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)')          % 显示图像图例

生成图像如图:
4

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)

生成图像如图:
5

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

生成图像如图:
4

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):
6

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

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)          % 绘制二维水平条形图

生成图像如图:
9

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);          % 画直方图 

生成图像如图:
10

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) 为例):
7

12.3.4 极坐标图

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

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

生成图像如图:
8

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

生成图像如图:
11

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

生成图像如图:
13

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

生成图像如图:
14

13.2 三维曲面图

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

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

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

矩阵X值为:
X
矩阵Y值为:
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

生成图像如图:
16

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)):
17
生成图像如图(surf(X,Y,Z)):
18

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)生成图像如图右,
1919

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);

绘制其图像为:
20

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’
21222324
三次样条插值:
25

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计算微分结果如图所示
11

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)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB基础语法总结 的相关文章

  • 在Matlab中对字符进行分组并形成矩阵

    我有 26 个字符 A 到 Z 我将 4 个字符组合在一起 并用空格分隔以下 4 个字符 如下所示 abcd efgh ijkl mnop qrst uvwx yz 我的Matlab编码如下 str abcdefghijklmnopqrst
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 我如何编写一个名为 dedbi 的 MATLAB 函数,它将输入 xtx 作为字符串并返回另一个字符串 xtxx 作为输出。

    dedbi 反转单词 即 a 将被 z 替换 b 将被 y 替换 c 将被 x 替换 依此类推 dedbi 将对大写字母执行相同的操作 即将字符串 A 替换为 Z 将 B 替换为 Y 将 C 替换为 X 依此类推 如果我给函数这个字符串 a
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • 如何在 MATLAB 中将矩阵元素除以列总和?

    有没有一种简单的方法可以将每个矩阵元素除以列和 例如 input 1 4 4 10 output 1 5 4 14 4 5 10 14 以下是执行此操作的不同方法的列表 使用bsxfun https www mathworks com he
  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp
  • MATLAB问题:在图块中引用变量的值[重复]

    这个问题在这里已经有答案了 可能的重复 matlab 绘图标题中的变量 https stackoverflow com questions 5629458 matlab variable in plot title 我想在图中引用 m 文件
  • 如何在Matlab中将图像从笛卡尔坐标更改为极坐标?

    我正在尝试将图像的像素从 x y 坐标转换为极坐标 但我遇到了问题 因为我想自己编写该函数 这是我到目前为止所做的代码 function newImage PolarCartRot read and show the image image
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • 在 MATLAB 图中用值标记点

    以下命令确实用正方形标记了点 但没有在其中放入值 例如 21 0 X 21 8 2 1 0 Y 0 1 2 3 4 plot X Y k s 我应该添加哪个参数以便全部5点值出现在图上吗 这些值不能一一键入 因为它们是随机数 因此它们可能会
  • matlab中优先级队列的实现方法

    matlab中有没有提供minpriorityqueue功能的库 import java util PriorityQueue import java util public class MyQueue Comparator
  • Matlab下降低图像质量

    问候 我正在尝试找到一种简单的方法来处理图像 以便将其质量从 8 位降低到 3 位 实现这一目标的最简单方法是什么 干杯 如果要线性缩放 只需将每个像素值除以 255 7 即 如果原始图像存储在矩阵 I 中 则让低分辨率图像 J I 255
  • 在Matlab图例中使用Latex?

    我的 matlab 不接受我的 Latex 例如 如果我使用legend b 6 rightarrow b 7 它没有向我显示箭头 我该如何解决这个问题 尝试使用 Latex 解释器 例如 legend b 6 rightarrow b 7
  • 使用 scipy.io 将 python pandas dataframe 转换为 matlab 结构

    我正在尝试使用 scipy io 将 pandas 数据帧保存到 matlab mat 文件 我有以下内容 array1 np array 1 2 3 array2 np array a b c array3 np array 1 01 2
  • MATLAB 问题中的 Parfor

    为什么我不能使用parfor在这段代码中 parfor i 1 r for j 1 N r xr j N r i 1 x i r j 1 end end 这是错误 错误 parfor 中的变量 xr 无法分类 请参阅 MATLAB 中的并行
  • MATLAB - 从目录读取文件?

    我希望从目录中读取文件并对每个文件迭代执行操作 此操作不需要更改文件 我知道我应该为此使用 for 循环 到目前为止我已经尝试过 FILES ls path to folder for i 1 size FILES 1 STRU pdbre

随机推荐

  • uniapp 电商app支付倒计时处理

    电商app支付倒计时 所有电商app支付页面都是有倒计时的 一来可以促进消费 二来可以减少恶意减库存的问题发生 因为创建订单的时候 除了预售的商品外 实际销售的商品是需要减库存的 一般的电商app倒计时都是30分钟或者45分钟的 如果在此页
  • 带调速功能的arduino摇头避障小车

    一 材料同上篇文章 二 接线同上篇文章 L298N红板有两个使能端口ENA和ENB 这两个端口默认是有跳线帽的 也就是接5V的 此时输出就是HIGH或者LOW 摘掉跳线帽 将外边端口分别接arduino的PWM接口就好 本文接的是3和11
  • 3.[人脸识别] python-opencv 人脸特征采集与录入

    目录 1 环境 2 描述 3 代码 4 效果 1 环境 1 python 3 6 6 64bit 2 python packages 1 opencv python 3 4 1 15 2 opencv contrib python 4 4
  • 李沐动手学深度学习V2-微调练习

    1 继续提高finetune net的学习率 模型的准确性如何变化 原实验参数 lr 5e 5 batch size 128 num epochs 5 lr 5e 4 lr 5e 6 2 2 在比较实验中进一步调整finetune net和
  • 2018.5.21 . XMLSpy激活的方法

    127 0 0 1 altova com XMLspy 127 0 0 1 www altova com XMLspy 127 0 0 1 link altova com XMLspy 追加加到 C WINDOWS system32 dri
  • Python爬虫

    一 什么是代理 二 代理服务器的作用 可以进行请求的响应和转发 三 在爬虫中为何要使用代理 如果我们使用爬虫对一个网站在一段时间内发起一个高频请求 该网站会检测出这个异常的现象 并将异常的请求 IP 获取 将 IP 加入到黑名单 然后改 I
  • [无线通信基础-14]:图解移动通信技术与应用发展-2-第一代移动模拟通信大哥大

    前言 第一代移动通信主要采用的是模拟通信技术和频分多址 FDMA 技术 模拟通信 analog communication 是利用正弦波的幅度 频率或相位的变化 或者利用脉冲的幅度 宽度或位置变化来模拟原始信号 以达到通信的目的 故称为模拟
  • PyTorch中的符号索引和函数索引用法

    Pytorch中很多函数都采用的是函数式索引的思路 而且使用函数式索引对代码可读性会有很大提升 张量的符号索引 张量也是有序序列 我们可以根据每个元素在系统内的顺序位置 来找出特定的元素 也就是索引 一维张量的索引 一维张量索引与Pytho
  • 基于MATLAB的二进制数字调制与解调信号的仿真——2ASK

    实现二进制数字调制与解调信号的仿真是我的MATLAB课程设计的一部分 我参考了网上的一些资料 并加入了一些自己的想法 代码已在本地MATLAB编译通过且能正常运行 2ASK 二进制振幅键控 i 10 10个码元 j 5000 t linsp
  • java线程分析工具

    下载网站 IBM Thread and Monitor Dump Analyzer for Java TMDA 效果图
  • java8新特性-总览

    转眼真正工作的时间也一年多了 说实话虽然老板对我是肯定的 但是我对自己还是很不满意所以学习吧骚年们 Java8新特性 Java8算是java语言的一个大版本还是很有必要学习的 包括函数式编程 新的JavaScript引擎 新的日期API 新
  • 【附带配置疑问解决】Keil5配置ST-Link仿真器下载程序的方法

    0 首先需要安装好ST Link驱动 方法参阅CSDN其他文章或自行百度 1 点击魔术棒 2 选择Debug 按下图下拉框选择ST Link后 点击Settings 3 Flash Download设置如下 4 Pack设置 要把Enabl
  • 【Linux】【Ubuntu】在VMware虚拟机中安装Ubuntu18.04(UEFI启动图文教程)

    在VMware虚拟机中安装Ubuntu18 04 以UEFI方式启动 VMware 版本 15 5 以UEFI启动的Ubuntu系统安装方式与 Linux Ubuntu 在VMware虚拟机中安装Ubuntu18 04 保姆级图文教程 中记
  • BeagleBone 实施 Yocto 项目

    特点 Yocto 项目生产工具和流程 支持为嵌入式软件创建 Linux 发行版 独立于架构 BeagleBone Black 是一个平台 允许用户根据自己的喜好快速轻松地执行安装和自定义 从 Yocto Project 构建系统的基本介绍开
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 第五届蓝桥杯—— 基础练习:数列特征

    问题描述 给出n个数 找出这n个数的最大值 最小值 和 输入格式 第一行为整数n 表示数的个数 第二行有n个数 为给定的n个数 每个数的绝对值都小于10000 输出格式 输出三行 每行一个整数 第一行表示这些数中的最大值 第二行表示这些数中
  • C++11中的原子操作(atomic operation)

    所谓的原子操作 取的就是 原子是最小的 不可分割的最小个体 的意义 它表示在多个线程访问同一个全局资源的时候 能够确保所有其他的线程都不在同一时间内访问相同的资源 也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问 这有点类似互斥对象
  • AIops | 一文了解日志异常检测

    作者 李旭光 中国农业银行研发中心责编 晋兆雨出品 CSDN云计算头图 付费下载于视觉中国 背景介绍 日志是有关系统运行状态的描述 例如Linux的系统日志 数据库系统的日志以及分布式系统的日志等 日志是运维人员查看系统运行状态 寻找系统故
  • Java Eclipse进行断点调试

    如何调试Java程序 大家最开始学习Java 都会觉得IDE调试好高端有木有 其实很简单了 下文会尽量简单直观的教会你在Eclipse中调试 其他的IDE调试步骤也是类似的 1 在你觉得有错的地方设置断点 在代码行数前 点击右键 注意是右键
  • MATLAB基础语法总结

    主体参照 全网最全MATLAB学习归纳总结 建模学习必备 MATLAB讲解PPT和MATLAB官方帮助文档这里对该教程做一定的完善与汇总 1 MATLAB编辑器常用快捷键 1 1 编辑器窗口操作 编辑器窗口操作 自动整理代码 用鼠标选中代码