编辑器窗口操作 | |
---|---|
自动整理代码 | 用鼠标选中代码行,按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表示编辑器窗口向右切换文件 |
代码调试常用快捷键: | |
---|---|
运行 | F5(可保存并直接运行程序) |
执行选中代码段 | F9 |
单步执行 | F10 |
遇见子函数时,进入函数内部 | F11 |
执行完子函数的剩余程序,并跳出子函数 | Shift + F11 |
两种设置或取消断点的方法 | (1) 在要设置断点的行左侧的-处单击; (2) 可按F12设置断点。 |
直接跳至某行 | 按Ctrl + G,弹出对话框,输入行号,可直接跳转至对应行 一般在程序源代码很长时,调试程序使用 |
强制中断程序的运行 | Ctrl + C |
命令窗口 | |
---|---|
再现历史命令 | 上下光标键↑↓ ,在命令窗口中,上下光标键可以调用Matlab最近使用过的历史命令,便于快速重新执行。 如果输入命令的前几个字母,再使用光标键,则只会选择以这些字母开始的命令。 上下箭头寻找此前和此后输入的命令,每次一条。 |
快速退出MATLAB | Ctrl + Q |
清除输入的命令 | Esc |
将光标处至结尾之间的代码删除 | Ctrl + K |
what | 显示当前工作路径中的所有代码文件 |
type 代码文件名 | 显示代码文件的内容 |
edit | 启动编辑器,并新建一个空白文件 |
edit 代码文件名 | 打开相应代码文件 |
whatsnew | 列出MATLAB新版本更新的内容 |
切换窗口 | |
---|---|
Ctrl+0 | 命令行窗口(Command Window) |
Ctrl + Shift + 0 | 编辑器窗口(Editor) |
Ctrl + 1 | 历史命令窗口(Command History) |
Ctrl + 2 | 当前工作窗口(Current Folder) |
Ctrl + 3 | 工作空间(Workspace) |
命令 | 目的/作用 |
---|---|
clc | 清除命令窗口。 |
clear | 从内存中删除变量。 |
help | 搜索帮助主题。 |
exist | 检查存在的文件或变量。 |
global | 声明变量为全局。 |
lookfor | 搜索帮助关键字条目。 |
quit | 停止MATLAB。 |
who | 列出当前变量。 |
whos | 列出当前变量(长显示)。 |
命令 | 目的/作用 |
---|---|
cd | 改变当前目录。 |
date | 显示当前日期。 |
delete | 删除一个文件。 |
diary | 日记文件记录开/关切换。 |
dir | 列出当前目录中的所有文件。 |
path | 显示搜索路径。 |
pwd | 显示当前目录。 |
save | 保存在一个文件中的工作区变量。 |
load | 负载工作区从一个文件中的变量。 |
type | 显示一个文件的内容。 |
what | 列出所有MATLAB文件在当前目录中。 |
wklread | 读取.wk1电子表格文件。 |
[ ] 矩阵
{ } 集合
struct( ) 结构体
’ ’ 字符数组
" " 字符串
运算符 | 目的 |
---|---|
+ | 加;加法运算符 |
- | 减;减法运算符 |
* | 标量和矩阵乘法运算符 |
.* | 数组乘法运算符 |
^ | 标量和矩阵求幂运算符 |
.^ | 数组求幂运算符 |
\ | 矩阵左除 |
/ | 矩阵右除 |
.\ | 阵列左除 |
./ | 阵列右除 |
= | 赋值运算符 |
**注意:*
、/
、^
等等,分为 数组乘法 和 矩阵乘法,数组乘法为 点乘 **
运算符 | 目的 |
---|---|
: | 向量生成;子阵提取 |
( ) | 下标运算;参数定义 |
[ ] | 矩阵生成 |
. | 点乘运算,常与其他运算符联合使用 |
… | 续行标志;行连续运算符 注意:… 后面内容将会被视作为注释 |
, | 分行符(该行结果不显示) |
; | 语句结束;分行符(该行结果显示) |
% | 注释标志 多行注释:%{ 需要注释不执行的若干命令行 %} |
_ | 引用符号和转置运算符 |
._ | 非共轭转置运算符 |
运算函数 | 功能 |
---|---|
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) | 截断取整 / 向下取整 / 向上取整 / 四舍五入取整 |
运算符 | 功能 |
---|---|
< <= == > >= ~= | 小于 小于等于 等于 大于 大于等于 不等于 返回值为 逻辑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
函数 | 描述 |
---|---|
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 |
函数 | 描述 |
---|---|
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 | 数组中唯一的值 |
函数 | 描述 |
---|---|
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) | 检测数组中的空格字符 |
函数 | 描述 |
---|---|
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
以下内容摘选字C语言变量标识符规则;
1. 变量名由字母、数字、下划线组成,并且首字母不能是数字。
2. 不能把关键字作为变量名,例如:if、for、while等。
3. 变量名最长63字符。
4. 变量名严格区分大小写。
5. 变量名应做到"见名知意",例如,长度(外语:length),求和、总计(外语:sum),圆周率(外语:pi)
用一个简单的方法指定变量,如:
x = 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;
% 删除内存中所有变量;
MATLAB支持以下特殊变量和常量:
Name | Meaning |
---|---|
ans | 默认的变量名,以应答最近依次操作运算结果 |
eps | 浮点数的相对误差 |
i,j | 虚数单位,定义为 i^2 = j^2 = -1 |
Inf | 代表无穷大 |
NaN | 代表不定值(不是数字) |
pi | 圆周率 |
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 的结合,根据数据选择适当的显示方式 |
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 % +
% 创建行向量
r = [7 8 9 10 11];
r = [7,8,9,10,11];
% 创建列向量
r = [7;8;9;10;11];
使用 , 或 ; 进行向量组合
水平串联,两个矩阵是使用逗号 “,” 分隔开的;
垂直串联:两个矩阵是使用分号 “;” 分隔开的;
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];
% 使用 : 生成向量
% [首位元素 : 元素间隔 : 末尾元素]
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
% 使用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 个点
% 创建行向量
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
% 数字 * 向量
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
包含向量转置及向量的模
% 向量转置
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
% 矩阵的同行元素之间用空格(或 “,”)隔开;
% 矩阵的行与行之间用 “;”(或回车符)隔开;
m = [1,2,3; 4 5 6
7 8,9]; % 创建矩阵
水平串联,两个矩阵是使用逗号 “,” 分隔开的;
垂直串联:两个矩阵是使用分号 “;” 分隔开的;
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
函数 | 功能 |
---|---|
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分别为行数和列数
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
包含:① 删除某行/列;② 矩阵组合;③ 矩阵元素修改
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
%% 矩阵 与 标量 四则运算
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
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为上三角矩阵
命令 | 作用/目的 |
---|---|
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根据实际需求确定
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
% 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
使用 ones(), zeros() 或 rand() 函数建立多维数组
如:ones(3,3,2);
多维数组经常转化为二维数组(矩阵)操作,如:
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) 三个二维数组(矩阵)进行操作
元胞数组是一种包含名为元胞的索引数据容器的数据类型,其中的每个元胞都可以包含任意类型的数据。
% 预先分配空间
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]}
% 预先分配空间
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'},{[]} ; {[]} {[]} {[]}
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 (是 矩阵里面的值)
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; 注:此方法仅能导入纯数字文件
导入 [表格.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文件
导出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开始写入
% 写入结果如图所示:
写入结果如图所示:
%%%%%% 导入 %%%%%%
% 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)
%%%%%% 导入 %%%%%%
% 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 即可
fprintf
使用)函数 | 描述 |
---|---|
fprintf | 将数据写入文本文件 |
fscanf | 从文本文件读取数据 |
fopen | 打开文件, 或获取有关打开的文件的信息 |
fclose | 关闭一个或全部已打开的文件 |
feof | 测试文件结尾 |
ferror | 有关文件I / O错误的信息 |
fgetl | 从文件读取行, 删除换行符 |
fgets | 从文件读取行, 保留换行符 |
fread | 从二进制文件读取数据 |
frewind | 将文件位置指示器移动到打开文件的开头 |
fseek | 移动到文件中的指定位置 |
ftell | 获得打开文件的位置 |
fwrite | 将数据写入二进制文件 |
MATLAB中绘图步骤如下:
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)
生成图像如图:
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 | 以当前坐标轴范围为基础,将坐标轴区域调整为方格形 |
生成图像如图:
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 | 六角形 标记点 |
* | * 标记点 |
生成图像如图:品红色虚线
使用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)') % 显示图像图例
生成图像如图:
使用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)
生成图像如图:
多重作图使用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
生成图像如图:
通过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):
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)
生成图像如图(上图正常曲线,下图为使用不同坐标曲线):
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) % 绘制二维水平条形图
生成图像如图:
% 用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); % 画直方图
生成图像如图:
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) 为例):
使用polar(theta,rho)
生成极坐标图
% polar(theta,rho)
theta = 0:.01:pi;
rho = sin(3*theta).*cos(2*theta);
polar(theta, rho, '-m')
生成图像如图:
a=[.5 1 1.6 1.2 0.8 2.1];
pie(a,a==max(a)); %对a作饼图,并抽出最大的切片
生成图像如图:
函数 | 图形 |
---|---|
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) | 绘制羽毛图 |
f = @(x) 2.*exp(-x).*sin(x) % f = 2.*exp(-x).*sin(x)
fplot(f , [0 8]); % 在区间 [0,8] 绘制函数
% 求最小值
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
使用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
生成图像如图:
若要创建曲面,则需要使用Meshgrid
生成网格:
x=-3: 0.3 :3; % 选择x轴的值
y=-3: 0.3: 3; % 选择y轴的值
[X,Y] = meshgrid(x,y);
矩阵X值为:
矩阵Y值为:
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
生成图像如图:
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)
):
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)
生成图像如图右,
%% 生成图像
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
使用方法类似C语言语法,详细使用方法可参照C语言语法讲解
a = 100;
if(a == 1)
% 执行分支语句
elseif(a == 20)
% 执行分支语句
elseif a == 30 % if后面的()可以不加
% 执行分支语句
else % 上述情况均不满足
% 执行分支语句
end % 注意 switch 需要以 end 进行结尾
% 注意:if语句可以嵌套
使用方法类似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 进行结尾
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语句可以嵌套
使用方法类似C语言语法,详细使用方法可参照C语言语法讲解;
while( bool ) % while 后面的()可以不加
% 执行循环语句,直到while内bool表达式为假
end
break
和comtinue
使用方法类似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
函数是一组语句一起执行任务。在MATLAB中,函数定义在单独的文件,文件函数的名称应该是相同的。
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
在名为 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语言 的 静态函数
匿名函数可以接受多个输入并返回一个输出。它们可能只包含一个可执行语句。
%% 语法
% 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
全局变量可以共享由一个以上的函数。
% 设置全局变量函数
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 % 直接声明全局变量,此时可以对其进行使用
解方程组的基本方法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)
详见:12.4 使用函数进行数据分析
%% 计算方法
p = [3 2 1]; % 多项式:3.*x.^2 + 2.*x + 1
x = [5 7 9];
y = polyval(p,x) % 计算 多项式p 在点 [5 7 9] 上的值
% 注意此方法本质上是对散点进行拟合,为曲线拟合内容;
% 而不是完全的函数逼近;
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);
绘制其图像为:
%% 一般插值方法
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’
三次样条插值:
% 求方程 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
% 求多项式 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
% 求多项式 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)
%% 不定积分
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
%% 直接求解
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
%%
% 基础用法
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
数值积分使用 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
%% 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)');
使用diff
和gradient
计算微分结果如图所示
旧版本写法:
dsolve(‘方程1’,‘方程2’,…,‘方程n’,‘初始条件’,‘自变量’)
初始条件省缺时,是求微分方程的通解。
Dy代表y的导数,D2y代表y的二阶导数, D3y代表y的三阶导数……
新版本写法:
将字符声明为系统变量,使用diff(y,x)
作为微分变量
**e.p1:**基本用法:
% 旧版本
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:**高阶微分方程:
% 旧版本
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:**微分方程组:
% 旧版本
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);
多数微分方程是没有解析解的,主要依靠数值解法来解决!求数值解的方法有欧拉法、龙格-库塔法等。详细见表格:
微分方程需要为:形式
**e.p.1:**基本用法:
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');
绘制图像分别为:
**e.p.2:**微分方程组
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
**e.p.3:**高阶微分方程必须等价的变换成一阶微分方程组,然后求解:
,设 y1=y , y2=y’=y1’ , y2’=y’',问题转换为:
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
绘制图像为:
%% 拉普拉斯变换
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)
1. 傅里叶正变换
Matlab命令:fourier
fourier(f,w)
——返回的傅里叶变换以w为默认变量,即求
例:计算 的傅里叶变换。
%% 傅里叶变换
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为默认变量,即求
例:计算 的傅里叶逆变换。
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)]
中文版网址: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)]