- Matlab 教程
- MATLAB - 主页
- MATLAB - 概述
- MATLAB - 特性
- MATLAB - 环境设置
- MATLAB - 编辑器
- MATLAB - 在线
- MATLAB - 工作区
- MATLAB - 语法
- MATLAB - 变量
- MATLAB - 命令
- MATLAB - 数据类型
- MATLAB - 运算符
- MATLAB - 日期和时间
- MATLAB - 数字
- MATLAB - 随机数
- MATLAB - 字符串和字符
- MATLAB - 文本格式化
- MATLAB - 时间表
- MATLAB - M 文件
- MATLAB - 冒号表示法
- MATLAB - 数据导入
- MATLAB - 数据输出
- MATLAB - 数据归一化
- MATLAB - 预定义变量
- MATLAB - 决策
- MATLAB - 决策语句
- MATLAB - If End 语句
- MATLAB - If Else 语句
- MATLAB - If…Elseif Else 语句
- MATLAB - 嵌套 If 语句
- MATLAB - Switch 语句
- MATLAB - 嵌套 Switch
- MATLAB - 循环
- MATLAB - 循环
- MATLAB - For 循环
- MATLAB - While 循环
- MATLAB - 嵌套循环
- MATLAB - Break 语句
- MATLAB - Continue 语句
- MATLAB - End 语句
- MATLAB - 数组
- MATLAB - 数组
- MATLAB - 向量
- MATLAB - 转置运算符
- MATLAB - 数组索引
- MATLAB - 多维数组
- MATLAB - 兼容数组
- MATLAB - 分类数组
- MATLAB - 元胞数组
- MATLAB - 矩阵
- MATLAB - 稀疏矩阵
- MATLAB - 表格
- MATLAB - 结构体
- MATLAB - 数组乘法
- MATLAB - 数组除法
- MATLAB - 数组函数
- MATLAB - 函数
- MATLAB - 函数
- MATLAB - 函数参数
- MATLAB - 匿名函数
- MATLAB - 嵌套函数
- MATLAB - Return 语句
- MATLAB - 空函数
- MATLAB - 局部函数
- MATLAB - 全局变量
- MATLAB - 函数句柄
- MATLAB - 滤波器函数
- MATLAB - 阶乘
- MATLAB - 私有函数
- MATLAB - 子函数
- MATLAB - 递归函数
- MATLAB - 函数优先级顺序
- MATLAB - Map 函数
- MATLAB - Mean 函数
- MATLAB - End 函数
- MATLAB - 错误处理
- MATLAB - 错误处理
- MATLAB - Try...Catch 语句
- MATLAB - 调试
- MATLAB - 绘图
- MATLAB - 绘图
- MATLAB - 绘制数组
- MATLAB - 绘制向量
- MATLAB - 条形图
- MATLAB - 直方图
- MATLAB - 图形
- MATLAB - 2D 线性图
- MATLAB - 3D 图
- MATLAB - 格式化绘图
- MATLAB - 对数坐标轴图
- MATLAB - 绘制误差条
- MATLAB - 绘制 3D 等值线图
- MATLAB - 极坐标图
- MATLAB - 散点图
- MATLAB - 绘制表达式或函数
- MATLAB - 绘制矩形
- MATLAB - 绘制频谱图
- MATLAB - 绘制网格曲面
- MATLAB - 绘制正弦波
- MATLAB - 插值
- MATLAB - 插值
- MATLAB - 线性插值
- MATLAB - 2D 数组插值
- MATLAB - 3D 数组插值
- MATLAB - 多项式
- MATLAB - 多项式
- MATLAB - 多项式加法
- MATLAB - 多项式乘法
- MATLAB - 多项式除法
- MATLAB - 多项式的导数
- MATLAB - 变换
- MATLAB - 变换
- MATLAB - 拉普拉斯变换
- MATLAB - 拉普拉斯滤波器
- MATLAB - 高斯-拉普拉斯滤波器
- MATLAB - 逆傅里叶变换
- MATLAB - 傅里叶变换
- MATLAB - 快速傅里叶变换
- MATLAB - 2D 逆余弦变换
- MATLAB - 向坐标轴添加图例
- MATLAB - 面向对象
- MATLAB - 面向对象编程
- MATLAB - 类和对象
- MATLAB - 函数重载
- MATLAB - 运算符重载
- MATLAB - 用户定义类
- MATLAB - 复制对象
- MATLAB - 代数
- MATLAB - 线性代数
- MATLAB - 高斯消元法
- MATLAB - 高斯-约旦消元法
- MATLAB - 简化行阶梯形式
- MATLAB - 特征值和特征向量
- MATLAB - 积分
- MATLAB - 积分
- MATLAB - 二重积分
- MATLAB - 梯形法则
- MATLAB - 辛普森法则
- MATLAB - 杂项
- MATLAB - 微积分
- MATLAB - 微分
- MATLAB - 矩阵的逆
- MATLAB - GNU Octave
- MATLAB - Simulink
- MATLAB - 有用资源
- MATLAB - 快速指南
- MATLAB - 有用资源
- MATLAB - 讨论
MATLAB - 快速指南
MATLAB - 概述
MATLAB(矩阵实验室)是一种第四代高级编程语言和交互式环境,用于数值计算、可视化和编程。
MATLAB 由 MathWorks 开发。
它允许进行矩阵操作;函数和数据的绘图;算法的实现;用户界面的创建;与用其他语言编写的程序接口,包括 C、C++、Java 和 FORTRAN;分析数据;开发算法;以及创建模型和应用程序。
它具有许多内置命令和数学函数,可帮助您进行数学计算、生成绘图和执行数值方法。
MATLAB 的计算数学能力
MATLAB 用于计算数学的各个方面。以下是它最常用于的一些常用数学计算:
- 处理矩阵和数组
- 2D 和 3D 绘图和图形
- 线性代数
- 代数方程
- 非线性函数
- 统计
- 数据分析
- 微积分和微分方程
- 数值计算
- 积分
- 变换
- 曲线拟合
- 各种其他特殊函数
MATLAB 的特性
以下是 MATLAB 的基本特性:
它是一种用于数值计算、可视化和应用程序开发的高级语言。
它还提供了一个交互式环境,用于迭代探索、设计和解决问题。
它提供了丰富的数学函数库,用于线性代数、统计、傅里叶分析、滤波、优化、数值积分和求解常微分方程。
它提供了用于可视化数据和创建自定义绘图的内置图形。
MATLAB 的编程接口提供了开发工具,用于提高代码质量、可维护性和最大化性能。
它提供了用于构建具有自定义图形界面的应用程序的工具。
它提供了用于将基于 MATLAB 的算法与外部应用程序和语言(如 C、Java、.NET 和 Microsoft Excel)集成的函数。
MATLAB 的用途
MATLAB 广泛用作科学和工程中的计算工具,涵盖物理学、化学、数学和所有工程学科。它用于各种应用,包括:
- 信号处理和通信
- 图像和视频处理
- 控制系统
- 测试和测量
- 计算金融
- 计算生物学
MATLAB - 环境设置
本地环境设置
设置 MATLAB 环境只需点击几下即可。安装程序可以从这里下载。
MathWorks 提供许可产品、试用版和学生版。您需要登录网站并等待一段时间以获得他们的批准。
下载安装程序后,可以通过点击几下安装软件。
了解 MATLAB 环境
MATLAB 开发 IDE 可以从桌面上创建的图标启动。MATLAB 中的主要工作窗口称为桌面。启动 MATLAB 时,桌面将以其默认布局显示:
桌面包含以下面板:
当前文件夹 - 此面板允许您访问项目文件夹和文件。
命令窗口 - 这是在命令行输入命令的主要区域。它由命令提示符(>>)指示。
工作区 - 工作区显示从文件创建和/或导入的所有变量。
命令历史记录 - 此面板显示或返回在命令行输入的命令。
设置 GNU Octave
如果您想在您的机器(Linux、BSD、OS X 或 Windows)上使用 Octave,请从下载 GNU Octave下载最新版本。您可以查看给定的机器安装说明。
MATLAB - 基本语法
MATLAB 环境的行为类似于一个超级复杂的计算器。您可以在 >> 命令提示符下输入命令。
MATLAB 是一个解释型环境。换句话说,您发出一个命令,MATLAB 会立即执行它。
实践操作
输入一个有效的表达式,例如:
5 + 5
然后按 ENTER
当您单击“执行”按钮或键入 Ctrl+E 时,MATLAB 会立即执行它,并返回以下结果:
ans = 10
让我们再举几个例子:
3 ^ 2 % 3 raised to the power of 2
当您单击“执行”按钮或键入 Ctrl+E 时,MATLAB 会立即执行它,并返回以下结果:
ans = 9
另一个例子:
sin(pi /2) % sine of angle 90o
当您单击“执行”按钮或键入 Ctrl+E 时,MATLAB 会立即执行它,并返回以下结果:
ans = 1
另一个例子:
7/0 % Divide by zero
当您单击“执行”按钮或键入 Ctrl+E 时,MATLAB 会立即执行它,并返回以下结果:
ans = Inf warning: division by zero
另一个例子:
732 * 20.3
当您单击“执行”按钮或键入 Ctrl+E 时,MATLAB 会立即执行它,并返回以下结果:
ans = 1.4860e+04
MATLAB 为某些数学符号提供了一些特殊表达式,例如 pi 代表 π,Inf 代表 ∞,i(和 j)代表 √-1 等。Nan 代表“非数字”。
在 MATLAB 中使用分号 (;)
分号 (;) 表示语句的结束。但是,如果您想抑制和隐藏表达式的 MATLAB 输出,请在表达式后添加分号。
例如:
x = 3; y = x + 5
当您单击“执行”按钮或键入 Ctrl+E 时,MATLAB 会立即执行它,并返回以下结果:
y = 8
添加注释
百分号 (%) 用于指示注释行。例如:
x = 9 % assign the value 9 to x
您还可以使用块注释运算符 % { 和 % } 编写注释块。
MATLAB 编辑器包含工具和上下文菜单项,可帮助您添加、删除或更改注释的格式。
常用运算符和特殊字符
MATLAB 支持以下常用运算符和特殊字符:
运算符 | 用途 |
---|---|
+ | 加号;加法运算符。 |
- | 减号;减法运算符。 |
* | 标量和矩阵乘法运算符。 |
.* | 数组乘法运算符。 |
^ | 标量和矩阵幂运算符。 |
.^ | 数组幂运算符。 |
\ | 左除运算符。 |
/ | 右除运算符。 |
.\ | 数组左除运算符。 |
./ | 数组右除运算符。 |
: | 冒号;生成等间距的元素并表示整行或整列。 |
( ) | 括号;括起函数参数和数组索引;覆盖优先级。 |
[ ] | 方括号;括起数组元素。 |
. | 小数点。 |
… | 省略号;续行运算符 |
, | 逗号;分隔语句和行中的元素 |
; | 分号;分隔列并抑制显示。 |
% | 百分号;指定注释并指定格式。 |
_ | 引号和转置运算符。 |
._ | 非共轭转置运算符。 |
= | 赋值运算符。 |
特殊变量和常量
MATLAB 支持以下特殊变量和常量:
名称 | 含义 |
---|---|
ans | 最近的答案。 |
eps | 浮点数精度的精度。 |
i,j | 虚数单位√-1。 |
Inf | 无穷大。 |
NaN | 未定义的数值结果(非数字)。 |
pi | π值。 |
变量命名
变量名由一个字母后跟任意数量的字母、数字或下划线组成。
MATLAB区分大小写。
变量名可以是任意长度,但是MATLAB只使用前N个字符,其中N由函数namelengthmax给出。
保存您的工作
save命令用于将工作区中的所有变量保存为一个文件,该文件具有.mat扩展名,位于当前目录中。
例如:
save myfile
您可以稍后随时使用load命令重新加载该文件。
load myfile
MATLAB - 变量
在MATLAB环境中,每个变量都是一个数组或矩阵。
您可以用简单的方式分配变量。例如,
x = 3 % defining x and initializing it with a value
MATLAB将执行上述语句并返回以下结果:
x = 3
它创建一个名为x的1×1矩阵,并在其元素中存储值3。让我们再看一个例子,
x = sqrt(16) % defining x and initializing it with an expression
MATLAB将执行上述语句并返回以下结果:
x = 4
请注意:
一旦将变量输入系统,您以后就可以引用它。
变量必须在使用前具有值。
当表达式返回的结果未分配给任何变量时,系统将其分配给名为ans的变量,该变量以后可以使用。
例如:
sqrt(78)
MATLAB将执行上述语句并返回以下结果:
ans = 8.8318
您可以使用此变量ans:
sqrt(78); 9876/ans
MATLAB将执行上述语句并返回以下结果:
ans = 1118.2
让我们看另一个例子:
x = 7 * 8; y = x * 7.89
MATLAB将执行上述语句并返回以下结果:
y = 441.84
多重赋值
您可以在同一行进行多次赋值。例如,
a = 2; b = 7; c = a * b
MATLAB将执行上述语句并返回以下结果:
c = 14
我忘记了变量!
who命令显示您使用过的所有变量名。
who
MATLAB将执行上述语句并返回以下结果:
Your variables are: a ans b c
whos命令显示有关变量的更多信息:
- 当前内存中的变量
- 每个变量的类型
- 分配给每个变量的内存
- 它们是否是复数变量
whos
MATLAB将执行上述语句并返回以下结果:
Attr Name Size Bytes Class ==== ==== ==== ==== ===== a 1x1 8 double ans 1x70 757 cell b 1x1 8 double c 1x1 8 double Total is 73 elements using 781 bytes
clear命令从内存中删除所有(或指定的)变量。
clear x % it will delete x, won't display anything clear % it will delete all variables in the workspace % peacefully and unobtrusively
长赋值
长赋值可以使用省略号(...)扩展到另一行。例如,
initial_velocity = 0; acceleration = 9.8; time = 20; final_velocity = initial_velocity + acceleration * time
MATLAB将执行上述语句并返回以下结果:
final_velocity = 196
format命令
默认情况下,MATLAB以四位小数显示数字。这称为短格式。
但是,如果您需要更高的精度,则需要使用format命令。
format long命令显示小数点后16位数字。
例如:
format long x = 7 + 10/3 + 5 ^ 1.2
MATLAB将执行上述语句并返回以下结果:
x = 17.2319816406394
另一个例子:
format short x = 7 + 10/3 + 5 ^ 1.2
MATLAB将执行上述语句并返回以下结果:
x = 17.232
format bank命令将数字四舍五入到两位小数。例如,
format bank daily_wage = 177.45; weekly_wage = daily_wage * 6
MATLAB将执行上述语句并返回以下结果:
weekly_wage = 1064.70
MATLAB使用指数表示法显示大数字。
format short e命令允许以四位小数加指数的指数形式显示。例如,
例如:
format short e 4.678 * 4.9
MATLAB将执行上述语句并返回以下结果:
ans = 2.2922e+01
format long e命令允许以四位小数加指数的指数形式显示。例如,
format long e x = pi
MATLAB将执行上述语句并返回以下结果:
x = 3.141592653589793e+00
format rat命令给出计算结果的最接近的有理表达式。例如,
format rat 4.678 * 4.9
MATLAB将执行上述语句并返回以下结果:
ans = 34177/1491
创建向量
向量是一维数字数组。MATLAB允许创建两种类型的向量:
- 行向量
- 列向量
行向量通过将元素集括在方括号中创建,使用空格或逗号分隔元素。
例如:
r = [7 8 9 10 11]
MATLAB将执行上述语句并返回以下结果:
r = 7 8 9 10 11
另一个例子:
r = [7 8 9 10 11]; t = [2, 3, 4, 5, 6]; res = r + t
MATLAB将执行上述语句并返回以下结果:
res = 9 11 13 15 17
列向量通过将元素集括在方括号中创建,使用分号(;)分隔元素。
c = [7; 8; 9; 10; 11]
MATLAB将执行上述语句并返回以下结果:
c = 7 8 9 10 11
创建矩阵
矩阵是二维数字数组。
在MATLAB中,矩阵是通过将每一行输入为一系列空格或逗号分隔的元素来创建的,行的末尾用分号分隔。例如,让我们创建一个3×3矩阵:
m = [1 2 3; 4 5 6; 7 8 9]
MATLAB将执行上述语句并返回以下结果:
m = 1 2 3 4 5 6 7 8 9
MATLAB - 命令
MATLAB是一个用于数值计算和数据可视化的交互式程序。您可以通过在MATLAB提示符“>>”上键入命令在命令窗口中输入命令。
在本节中,我们将提供常用的一般MATLAB命令列表。
管理会话的命令
MATLAB提供了各种用于管理会话的命令。下表提供了所有此类命令:
命令 | 用途 |
---|---|
clc | 清除命令窗口。 |
clear | 从内存中删除变量。 |
exist | 检查文件或变量是否存在。 |
global | 声明变量为全局变量。 |
help | 搜索帮助主题。 |
lookfor | 在帮助条目中搜索关键字。 |
quit | 停止MATLAB。 |
who | 列出当前变量。 |
whos | 列出当前变量(长显示)。 |
与系统一起工作的命令
MATLAB提供了各种用于与系统一起工作的有用命令,例如将当前工作保存到工作区中作为文件,以及稍后加载文件。
它还提供了各种用于其他与系统相关的活动的命令,例如,显示日期、列出目录中的文件、显示当前目录等。
下表显示了一些常用的与系统相关的命令:
命令 | 用途 |
---|---|
cd | 更改当前目录。 |
date | 显示当前日期。 |
delete | 删除文件。 |
diary | 打开/关闭日记文件记录。 |
dir | 列出当前目录中的所有文件。 |
load | 从文件加载工作区变量。 |
path | 显示搜索路径。 |
pwd | 显示当前目录。 |
save | 将工作区变量保存到文件中。 |
type | 显示文件的内容。 |
what | 列出当前目录中的所有MATLAB文件。 |
wklread | 读取.wk1电子表格文件。 |
输入和输出命令
MATLAB提供以下输入和输出相关命令:
命令 | 用途 |
---|---|
disp | 显示数组或字符串的内容。 |
fscanf | 从文件读取格式化数据。 |
format | 控制屏幕显示格式。 |
fprintf | 对屏幕或文件执行格式化写入。 |
input | 显示提示并等待输入。 |
; | 抑制屏幕打印。 |
fscanf和fprintf命令的行为类似于C scanf和printf函数。它们支持以下格式代码:
格式代码 | 用途 |
---|---|
%s | 格式化为字符串。 |
%d | 格式化为整数。 |
%f | 格式化为浮点数。 |
%e | 以科学计数法格式化为浮点数。 |
%g | 以最紧凑的形式格式化:%f或%e。 |
\n | 在输出字符串中插入新行。 |
\t | 在输出字符串中插入制表符。 |
format函数具有以下用于数字显示的形式:
格式函数 | 显示最多 |
---|---|
format short | 四位小数(默认)。 |
format long | 16位小数。 |
format short e | 五位数字加指数。 |
format long e | 16位数字加指数。 |
format bank | 两位小数。 |
format + | 正数、负数或零。 |
format rat | 有理逼近。 |
format compact | 抑制一些换行符。 |
format loose | 重置为不太紧凑的显示模式。 |
向量、矩阵和数组命令
下表显示了用于处理数组、矩阵和向量的各种命令:
命令 | 用途 |
---|---|
cat | 连接数组。 |
find | 查找非零元素的索引。 |
length | 计算元素数量。 |
linspace | 创建等间距向量。 |
logspace | 创建对数间距向量。 |
max | 返回最大元素。 |
min | 返回最小元素。 |
prod | 每列的乘积。 |
reshape | 更改大小。 |
size | 计算数组大小。 |
sort | 对每列进行排序。 |
sum | 对每列求和。 |
eye | 创建单位矩阵。 |
ones | 创建全1数组。 |
zeros | 创建全0数组。 |
cross | 计算矩阵叉积。 |
dot | 计算矩阵点积。 |
det | 计算数组的行列式。 |
inv | 计算矩阵的逆。 |
pinv | 计算矩阵的伪逆。 |
rank | 计算矩阵的秩。 |
rref | 计算简化行阶梯形。 |
cell | 创建元胞数组。 |
celldisp | 显示元胞数组。 |
cellplot | 显示元胞数组的图形表示。 |
num2cell | 将数值数组转换为元胞数组。 |
deal | 匹配输入和输出列表。 |
iscell | 识别元胞数组。 |
绘图命令
MATLAB提供了许多用于绘制图形的命令。下表显示了一些常用的绘图命令:
命令 | 用途 |
---|---|
axis | 设置轴限。 |
fplot | 函数的智能绘图。 |
grid | 显示网格线。 |
plot | 生成xy图。 |
打印绘图或将绘图保存到文件。 | |
title | 在绘图顶部放置文本。 |
xlabel | 向x轴添加文本标签。 |
ylabel | 向y轴添加文本标签。 |
axes | 创建坐标轴对象。 |
close | 关闭当前绘图。 |
close all | 关闭所有绘图。 |
figure | 打开一个新的图形窗口。 |
gtext | 通过鼠标启用标签放置。 |
hold | 冻结当前绘图。 |
legend | 通过鼠标放置图例。 |
refresh | 重新绘制当前图形窗口。 |
set | 指定对象(如坐标轴)的属性。 |
subplot | 在子窗口中创建绘图。 |
text | 在图形中放置字符串。 |
bar | 创建条形图。 |
loglog | 创建对数-对数图。 |
polar | 创建极坐标图。 |
semilogx | 创建半对数图。(对数横坐标)。 |
semilogy | 创建半对数图。(对数纵坐标)。 |
stairs | 创建阶梯图。 |
stem | 创建茎状图。 |
MATLAB - M 文件
到目前为止,我们一直使用 MATLAB 环境作为计算器。但是,MATLAB 也是一种强大的编程语言,以及一个交互式计算环境。
在前面的章节中,您已经学习了如何从 MATLAB 命令提示符输入命令。MATLAB 还允许您将一系列命令写入文件,并将该文件作为一个完整的单元执行,就像编写函数并调用它一样。
M 文件
MATLAB 允许编写两种程序文件:
脚本 − 脚本文件是具有.m 扩展名的程序文件。在这些文件中,您编写要一起执行的一系列命令。脚本不接受输入也不返回任何输出。它们对工作区中的数据进行操作。
函数 − 函数文件也是具有.m 扩展名的程序文件。函数可以接受输入并返回输出。内部变量对函数是局部的。
您可以使用 MATLAB 编辑器或任何其他文本编辑器来创建您的.m文件。在本节中,我们将讨论脚本文件。脚本文件包含多行连续的 MATLAB 命令和函数调用。您可以通过在命令行键入其名称来运行脚本。
创建和运行脚本文件
要创建脚本文件,您需要使用文本编辑器。您可以通过两种方式打开 MATLAB 编辑器:
- 使用命令提示符
- 使用 IDE
如果您使用的是命令提示符,请在命令提示符中键入edit。这将打开编辑器。您可以直接键入edit,然后键入文件名(带有 .m 扩展名)
edit Or edit <filename>
上述命令将在默认的 MATLAB 目录中创建文件。如果您想将所有程序文件存储在特定文件夹中,则必须提供完整路径。
让我们创建一个名为 progs 的文件夹。在命令提示符 (>>) 处键入以下命令:
mkdir progs % create directory progs under default directory chdir progs % changing the current directory to progs edit prog1.m % creating an m file named prog1.m
如果您是第一次创建文件,MATLAB 会提示您确认。单击“是”。
或者,如果您使用的是 IDE,请选择“新建” -> “脚本”。这也会打开编辑器并创建一个名为 Untitled 的文件。您可以在键入代码后命名并保存文件。
在编辑器中键入以下代码:
NoOfStudents = 6000; TeachingStaff = 150; NonTeachingStaff = 20; Total = NoOfStudents + TeachingStaff ... + NonTeachingStaff; disp(Total);
创建并保存文件后,您可以通过两种方式运行它:
单击编辑器窗口上的运行按钮或
只需在命令提示符中键入文件名(不带扩展名):>> prog1
命令窗口提示符显示结果:
6170
示例
创建一个脚本文件,并键入以下代码:
a = 5; b = 7; c = a + b d = c + sin(b) e = 5 * d f = exp(-d)
编译并执行上述代码后,会产生以下结果:
c = 12 d = 12.657 e = 63.285 f = 3.1852e-06
MATLAB - 数据类型
MATLAB 不需要任何类型声明或维度语句。每当 MATLAB 遇到一个新的变量名时,它都会创建该变量并分配适当的内存空间。
如果变量已存在,则 MATLAB 会用新内容替换原始内容,并在必要时分配新的存储空间。
例如:
Total = 42
上述语句创建一个名为“Total”的 1×1 矩阵,并在其中存储值 42。
MATLAB 中可用的数据类型
MATLAB 提供 15 种基本数据类型。每种数据类型存储的数据都以矩阵或数组的形式存在。此矩阵或数组的大小至少为 0×0,并且可以增长到任何大小的矩阵或数组。
下表显示了 MATLAB 中最常用的数据类型:
序号 | 数据类型和描述 |
---|---|
1 | int8 8 位有符号整数 |
2 | uint8 8 位无符号整数 |
3 | int16 16 位有符号整数 |
4 | uint16 16 位无符号整数 |
5 | int32 32 位有符号整数 |
6 | uint32 32 位无符号整数 |
7 | int64 64 位有符号整数 |
8 | uint64 64 位无符号整数 |
9 | single 单精度数值数据 |
10 | double 双精度数值数据 |
11 | logical 逻辑值 1 或 0,分别表示真和假 |
12 | char 字符数据(字符串存储为字符向量) |
13 | cell array 索引单元格的数组,每个单元格都能够存储不同维度和数据类型的数组 |
14 | structure 类似 C 的结构体,每个结构体都有命名字段,能够存储不同维度和数据类型的数组 |
15 | function handle 指向函数的指针 |
16 | user classes 从用户定义的类构造的对象 |
17 | java classes 从 Java 类构造的对象 |
示例
创建一个包含以下代码的脚本文件:
str = 'Hello World!' n = 2345 d = double(n) un = uint32(789.50) rn = 5678.92347 c = int32(rn)
编译并执行上述代码后,会产生以下结果:
str = Hello World! n = 2345 d = 2345 un = 790 rn = 5678.9 c = 5679
数据类型转换
MATLAB 提供各种函数用于将值从一种数据类型转换为另一种数据类型。下表显示了数据类型转换函数:
函数 | 用途 |
---|---|
char | 转换为字符数组(字符串) |
int2str | 将整数数据转换为字符串 |
mat2str | 将矩阵转换为字符串 |
num2str | 将数字转换为字符串 |
str2double | 将字符串转换为双精度值 |
str2num | 将字符串转换为数字 |
native2unicode | 将数字字节转换为 Unicode 字符 |
unicode2native | 将 Unicode 字符转换为数字字节 |
base2dec | 将 N 进制数字字符串转换为十进制数字 |
bin2dec | 将二进制数字字符串转换为十进制数字 |
dec2base | 将十进制转换为字符串表示的 N 进制数字 |
dec2bin | 将十进制转换为字符串表示的二进制数字 |
dec2hex | 将十进制转换为字符串表示的十六进制数字 |
hex2dec | 将十六进制数字字符串转换为十进制数字 |
hex2num | 将十六进制数字字符串转换为双精度数字 |
num2hex | 将单精度和双精度转换为 IEEE 十六进制字符串 |
cell2mat | 将元胞数组转换为数值数组 |
cell2struct | 将元胞数组转换为结构体数组 |
cellstr | 从字符数组创建字符串的元胞数组 |
mat2cell | 将数组转换为元胞数组,其中元胞的大小可能不同 |
num2cell | 将数组转换为元胞数组,其中元胞的大小一致 |
struct2cell | 将结构体转换为元胞数组 |
数据类型的确定
MATLAB 提供各种函数用于识别变量的数据类型。
下表提供了用于确定变量数据类型的函数:
函数 | 用途 |
---|---|
is | 检测状态 |
isa | 确定输入是否为指定类的对象 |
iscell | 确定输入是否为元胞数组 |
iscellstr | 确定输入是否为字符串的元胞数组 |
ischar | 确定项目是否为字符数组 |
isfield | 确定输入是否为结构体数组字段 |
isfloat | 确定输入是否为浮点数组 |
ishghandle | 对于句柄图形对象句柄为真 |
isinteger | 确定输入是否为整数数组 |
isjava | 确定输入是否为 Java 对象 |
islogical | 确定输入是否为逻辑数组 |
isnumeric | 确定输入是否为数值数组 |
isobject | 确定输入是否为 MATLAB 对象 |
isreal | 检查输入是否为实数数组 |
isscalar | 确定输入是否为标量 |
isstr | 确定输入是否为字符数组 |
isstruct | 确定输入是否为结构体数组 |
isvector | 确定输入是否为向量 |
class | 确定对象的类 |
validateattributes | 检查数组的有效性 |
whos | 列出工作区中的变量,包括大小和类型 |
示例
创建一个包含以下代码的脚本文件:
x = 3 isinteger(x) isfloat(x) isvector(x) isscalar(x) isnumeric(x) x = 23.54 isinteger(x) isfloat(x) isvector(x) isscalar(x) isnumeric(x) x = [1 2 3] isinteger(x) isfloat(x) isvector(x) isscalar(x) x = 'Hello' isinteger(x) isfloat(x) isvector(x) isscalar(x) isnumeric(x)
运行该文件时,会产生以下结果:
x = 3 ans = 0 ans = 1 ans = 1 ans = 1 ans = 1 x = 23.540 ans = 0 ans = 1 ans = 1 ans = 1 ans = 1 x = 1 2 3 ans = 0 ans = 1 ans = 1 ans = 0 x = Hello ans = 0 ans = 0 ans = 1 ans = 0 ans = 0
MATLAB - 运算符
运算符是告诉编译器执行特定数学或逻辑操作的符号。MATLAB 旨在主要对整个矩阵和数组进行操作。因此,MATLAB 中的运算符既作用于标量数据也作用于非标量数据。MATLAB 允许以下类型的基本运算:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 按位运算
- 集合运算
算术运算符
MATLAB 允许两种不同类型的算术运算:
- 矩阵算术运算
- 数组算术运算
矩阵算术运算与线性代数中定义的相同。数组运算对一维和多维数组都进行逐元素执行。
矩阵运算符和数组运算符通过句点 (.) 符号区分。但是,由于加法和减法运算对于矩阵和数组来说是相同的,因此这两种情况下的运算符相同。下表简要描述了这些运算符:
序号 | 运算符和描述 |
---|---|
1 | + 加法或一元加法。A+B 将存储在变量 A 和 B 中的值相加。A 和 B 必须具有相同的大小,除非其中一个是标量。标量可以加到任何大小的矩阵上。 |
2 | - 减法或一元减法。A-B 从 A 中减去 B 的值。A 和 B 必须具有相同的大小,除非其中一个是标量。标量可以从任何大小的矩阵中减去。 |
3 | * 矩阵乘法。C = A*B 是矩阵 A 和 B 的线性代数乘积。更准确地说, 对于非标量 A 和 B,A 的列数必须等于 B 的行数。标量可以乘以任何大小的矩阵。 |
4 | .* 数组乘法。A.*B 是数组 A 和 B 的逐元素乘积。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
5 | / 斜杠或矩阵右除。B/A 粗略地等同于 B*inv(A)。更准确地说,B/A = (A'\B')'。 |
6 | ./ 数组右除。A./B 是元素为 A(i,j)/B(i,j) 的矩阵。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
7 | \ 反斜杠或矩阵左除。如果 A 是一个方阵,则 A\B 基本上等同于 inv(A)*B,但计算方式不同。如果 A 是一个 n×n 矩阵,而 B 是一个具有 n 个分量的列向量,或者是一个具有多个此类列的矩阵,则 X = A\B 是方程 AX = B 的解。如果 A 缩放比例不好或接近奇异,则会显示警告消息。 |
8 | .\ 数组左除。A.\B 是一个矩阵,其元素为 B(i,j)/A(i,j)。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
9 | ^ 矩阵幂。如果 p 是标量,则 X^p 是 X 的 p 次幂。如果 p 是整数,则幂通过重复平方计算。如果整数为负数,则先对 X 求逆。对于 p 的其他值,计算涉及特征值和特征向量,例如,如果 [V,D] = eig(X),则 X^p = V*D.^p/V。 |
10 | .^ 数组幂。A.^B 是一个矩阵,其元素为 A(i,j) 的 B(i,j) 次幂。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
11 | ' 矩阵转置。A' 是 A 的线性代数转置。对于复数矩阵,这是共轭转置。 |
12 | .' 数组转置。A.' 是 A 的数组转置。对于复数矩阵,这不会涉及共轭。 |
关系运算符
关系运算符也可以作用于标量和非标量数据。数组的关系运算符对两个数组执行逐元素比较,并返回大小相同的逻辑数组,其中关系为真的元素设置为逻辑 1(真),关系为假的元素设置为逻辑 0(假)。
下表显示了 MATLAB 中可用的关系运算符 -
序号 | 运算符和描述 |
---|---|
1 | < 小于 |
2 | <= 小于或等于 |
3 | > 大于 |
4 | >= 大于或等于 |
5 | == 等于 |
6 | ~= 不等于 |
逻辑运算符
MATLAB 提供两种类型的逻辑运算符和函数 -
逐元素 - 这些运算符作用于逻辑数组的对应元素。
短路 - 这些运算符作用于标量和逻辑表达式。
逐元素逻辑运算符对逻辑数组逐元素进行运算。符号 &、| 和 ~ 分别是逻辑数组运算符 AND、OR 和 NOT。
短路逻辑运算符允许对逻辑运算进行短路。符号 && 和 || 分别是逻辑短路运算符 AND 和 OR。
按位运算
按位运算符作用于位并执行逐位运算。&、| 和 ^ 的真值表如下 -
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设 A = 60;B = 13;现在以二进制格式,它们将如下所示 -
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
MATLAB 提供了各种用于按位运算的函数,如“按位与”、“按位或”和“按位非”运算、移位运算等。
下表显示了常用的按位运算 -
函数 | 用途 |
---|---|
bitand(a, b) | 整数 a 和 b 的按位与 |
bitcmp(a) | a 的按位补码 |
bitget(a,pos) | 获取整数数组 a 中指定位置 pos 的位 |
bitor(a, b) | 整数 a 和 b 的按位或 |
bitset(a, pos) | 设置 a 的特定位置 pos 的位 |
bitshift(a, k) | 返回 a 左移 k 位的结果,等效于乘以 2k。k 的负值对应于右移位或除以 2|k| 并向负无穷大舍入。任何溢出位都被截断。 |
bitxor(a, b) | 整数 a 和 b 的按位异或 |
swapbytes | 交换字节顺序 |
集合运算
MATLAB 提供了各种用于集合运算的函数,如并集、交集和测试集合成员资格等。
下表显示了一些常用的集合运算 -
序号 | 函数 & 描述 |
---|---|
1 | intersect(A,B) 两个数组的集合交集;返回 A 和 B 共有的值。返回的值按排序顺序排列。 |
2 | intersect(A,B,'rows') 将 A 的每一行和 B 的每一行都视为单个实体,并返回 A 和 B 共有的行。返回矩阵的行按排序顺序排列。 |
3 | ismember(A,B) 返回一个与 A 大小相同的数组,其中 A 的元素在 B 中找到的位置为 1(真)。在其他位置,它返回 0(假)。 |
4 | ismember(A,B,'rows') 将 A 的每一行和 B 的每一行都视为单个实体,并返回一个向量,其中矩阵 A 的行也是 B 的行的位置为 1(真)。在其他位置,它返回 0(假)。 |
5 | issorted(A) 如果 A 的元素按排序顺序排列,则返回逻辑 1(真),否则返回逻辑 0(假)。输入 A 可以是向量或 N×1 或 1×N 字符串元胞数组。如果 A 和 sort(A) 的输出相等,则认为 A 已排序。 |
6 | issorted(A, 'rows') 如果二维矩阵 A 的行按排序顺序排列,则返回逻辑 1(真),否则返回逻辑 0(假)。如果 A 和 sortrows(A) 的输出相等,则认为矩阵 A 已排序。 |
7 | setdiff(A,B) 两个数组的集合差;返回 A 中不在 B 中的值。返回数组中的值按排序顺序排列。 |
8 | setdiff(A,B,'rows') 将 A 的每一行和 B 的每一行都视为单个实体,并返回 A 中不在 B 中的行。返回矩阵的行按排序顺序排列。 'rows' 选项不支持元胞数组。 |
9 | setxor 两个数组的集合异或 |
10 | union 两个数组的集合并集 |
11 | unique 数组中的唯一值 |
MATLAB - 决策
决策结构要求程序员指定一个或多个条件,由程序进行评估或测试,以及在确定条件为真时要执行的语句或语句,以及可选地在确定条件为假时要执行的其他语句。
以下是大多数编程语言中典型的决策结构的一般形式 -
MATLAB 提供以下类型的决策语句。单击以下链接以查看其详细信息 -
序号 | 语句 & 描述 |
---|---|
1 | if ... end 语句
if ... end 语句由一个布尔表达式后跟一个或多个语句组成。 |
2 | if...else...end 语句
if 语句后面可以跟一个可选的 else 语句,当布尔表达式为假时执行。 |
3 | If... elseif...elseif...else...end 语句
if 语句后面可以跟一个(或多个)可选的 elseif... 和一个 else 语句,这对于测试各种条件非常有用。 |
4 | 嵌套 if 语句
您可以在另一个 if 或 elseif 语句(s)中使用一个 if 或 elseif 语句。 |
5 | switch 语句
switch 语句允许将变量与其值列表进行相等性测试。 |
6 | 嵌套 switch 语句
您可以在另一个 switch 语句(s)中使用一个 switch 语句。 |
MATLAB - 循环类型
可能存在需要执行代码块多次的情况。通常,语句按顺序执行。函数中的第一个语句首先执行,然后是第二个语句,依此类推。
编程语言提供各种控制结构,允许更复杂的执行路径。
循环语句允许我们多次执行语句或语句组,以下是大多数编程语言中循环语句的一般形式 -
MATLAB 提供以下类型的循环来处理循环需求。单击以下链接以查看其详细信息 -
序号 | 循环类型 & 描述 |
---|---|
1 | while 循环
在给定条件为真的情况下重复执行语句或语句组。它在执行循环体之前测试条件。 |
2 | for 循环
多次执行一系列语句,并缩写管理循环变量的代码。 |
3 | 嵌套循环
您可以在任何其他循环中使用一个或多个循环。 |
循环控制语句
循环控制语句将其执行从正常顺序更改。当执行离开作用域时,在该作用域中创建的所有自动对象都会被销毁。
MATLAB 支持以下控制语句。单击以下链接以查看其详细信息。
序号 | 控制语句 & 描述 |
---|---|
1 | break 语句
终止 循环语句并将执行转移到循环后紧跟的语句。 |
2 | continue 语句
导致循环跳过其主体剩余部分,并在重新迭代之前立即重新测试其条件。 |
MATLAB - 向量
向量是一维数字数组。MATLAB允许创建两种类型的向量:
- 行向量
- 列向量
行向量
行向量通过将元素集括在方括号中创建,使用空格或逗号分隔元素。
r = [7 8 9 10 11]
MATLAB将执行上述语句并返回以下结果:
r = 7 8 9 10 11
列向量
列向量是通过将元素集括在方括号中创建的,使用分号分隔元素。
c = [7; 8; 9; 10; 11]
MATLAB将执行上述语句并返回以下结果:
c = 7 8 9 10 11
引用向量的元素
您可以通过多种方式引用向量的一个或多个元素。向量 v 的第 i 个分量称为 v(i)。例如 -
v = [ 1; 2; 3; 4; 5; 6]; % creating a column vector of 6 elements v(3)
MATLAB将执行上述语句并返回以下结果:
ans = 3
当您使用冒号引用向量时,例如 v(:),将列出向量的所有分量。
v = [ 1; 2; 3; 4; 5; 6]; % creating a column vector of 6 elements v(:)
MATLAB将执行上述语句并返回以下结果:
ans = 1 2 3 4 5 6
MATLAB 允许您从向量中选择一系列元素。
例如,让我们创建一个具有 9 个元素的行向量 rv,然后我们将通过编写 rv(3:7) 引用元素 3 到 7 并创建一个名为 sub_rv 的新向量。
rv = [1 2 3 4 5 6 7 8 9]; sub_rv = rv(3:7)
MATLAB将执行上述语句并返回以下结果:
sub_rv = 3 4 5 6 7
向量运算
在本节中,让我们讨论以下向量运算 -
MATLAB - 矩阵
矩阵是二维数字数组。
在 MATLAB 中,您可以通过输入每一行中以逗号或空格分隔的数字作为元素,并使用分号标记每一行的结束来创建矩阵。
例如,让我们创建一个 4×5 矩阵 a -
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]
MATLAB将执行上述语句并返回以下结果:
a = 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8
引用矩阵的元素
要引用矩阵mx中第m行和第n列的元素,我们写成−
mx(m, n);
例如,要引用上一节中创建的矩阵a的第2行第5列的元素,我们键入−
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; a(2,5)
MATLAB将执行上述语句并返回以下结果:
ans = 6
要引用第m列中的所有元素,我们键入A(:,m)。
让我们从矩阵a的第4行的元素创建一个列向量v−
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; v = a(:,4)
MATLAB将执行上述语句并返回以下结果:
v = 4 5 6 7
您还可以选择第m列到第n列的元素,为此我们写成−
a(:,m:n)
让我们创建一个较小的矩阵,取第二列和第三列的元素−
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; a(:, 2:3)
MATLAB将执行上述语句并返回以下结果:
ans = 2 3 3 4 4 5 5 6
同样,您可以创建一个子矩阵,取矩阵的一部分。
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; a(:, 2:3)
MATLAB将执行上述语句并返回以下结果:
ans = 2 3 3 4 4 5 5 6
同样,您可以创建一个子矩阵,取矩阵的一部分。
例如,让我们创建一个子矩阵sa,取a的内部子部分−
3 4 5 4 5 6
为此,请写−
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; sa = a(2:3,2:4)
MATLAB将执行上述语句并返回以下结果:
sa = 3 4 5 4 5 6
删除矩阵中的行或列
您可以通过将空方括号集[]分配给该行或列来删除矩阵的整行或整列。基本上,[]表示空数组。
例如,让我们删除a的第四行−
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; a( 4 , : ) = []
MATLAB将执行上述语句并返回以下结果:
a = 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7
接下来,让我们删除a的第五列−
a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]; a(: , 5)=[]
MATLAB将执行上述语句并返回以下结果:
a = 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 7
示例
在这个例子中,让我们创建一个3x3的矩阵m,然后我们将这个矩阵的第二行和第三行复制两次,创建一个4x3的矩阵。
创建一个包含以下代码的脚本文件:
a = [ 1 2 3 ; 4 5 6; 7 8 9]; new_mat = a([2,3,2,3],:)
运行文件时,它会显示以下结果−
new_mat = 4 5 6 7 8 9 4 5 6 7 8 9
矩阵运算
在本节中,让我们讨论以下基本且常用的矩阵运算−
MATLAB - 数组
MATLAB 中所有数据类型的变量都是多维数组。向量是一维数组,矩阵是二维数组。
我们已经讨论了向量和矩阵。在本章中,我们将讨论多维数组。但是,在此之前,让我们讨论一些特殊类型的数组。
MATLAB中的特殊数组
在本节中,我们将讨论一些创建一些特殊数组的函数。对于所有这些函数,单个参数创建一个正方形数组,双参数创建一个矩形数组。
zeros()函数创建一个全为零的数组−
例如:
zeros(5)
MATLAB将执行上述语句并返回以下结果:
ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ones()函数创建一个全为一的数组−
例如:
ones(4,3)
MATLAB将执行上述语句并返回以下结果:
ans = 1 1 1 1 1 1 1 1 1 1 1 1
eye()函数创建一个单位矩阵。
例如:
eye(4)
MATLAB将执行上述语句并返回以下结果:
ans = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
rand()函数创建一个(0,1)上均匀分布的随机数数组−
例如:
rand(3, 5)
MATLAB将执行上述语句并返回以下结果:
ans = 0.8147 0.9134 0.2785 0.9649 0.9572 0.9058 0.6324 0.5469 0.1576 0.4854 0.1270 0.0975 0.9575 0.9706 0.8003
幻方
幻方是一个正方形,当其元素按行、按列或对角线相加时,会产生相同的和。
magic()函数创建一个幻方数组。它接受一个单一参数,该参数给出正方形的大小。参数必须是大于或等于3的标量。
magic(4)
MATLAB将执行上述语句并返回以下结果:
ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
多维数组
在MATLAB中,具有两个以上维度的数组称为多维数组。MATLAB中的多维数组是普通二维矩阵的扩展。
通常,要生成多维数组,我们首先创建一个二维数组并对其进行扩展。
例如,让我们创建一个二维数组a。
a = [7 9 5; 6 1 9; 4 3 2]
MATLAB将执行上述语句并返回以下结果:
a = 7 9 5 6 1 9 4 3 2
数组a是一个3x3的数组;我们可以通过提供如下值来向a添加第三个维度−
a(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]
MATLAB将执行上述语句并返回以下结果:
a = ans(:,:,1) = 0 0 0 0 0 0 0 0 0 ans(:,:,2) = 1 2 3 4 5 6 7 8 9
我们也可以使用ones()、zeros()或rand()函数创建多维数组。
例如:
b = rand(4,3,2)
MATLAB将执行上述语句并返回以下结果:
b(:,:,1) = 0.0344 0.7952 0.6463 0.4387 0.1869 0.7094 0.3816 0.4898 0.7547 0.7655 0.4456 0.2760 b(:,:,2) = 0.6797 0.4984 0.2238 0.6551 0.9597 0.7513 0.1626 0.3404 0.2551 0.1190 0.5853 0.5060
我们还可以使用cat()函数构建多维数组。它沿着指定的维度连接数组列表−
cat()函数的语法为−
B = cat(dim, A1, A2...)
其中,
B是创建的新数组
A1、A2、...是要连接的数组
dim是沿其连接数组的维度
示例
创建一个脚本文件,并将以下代码输入其中−
a = [9 8 7; 6 5 4; 3 2 1]; b = [1 2 3; 4 5 6; 7 8 9]; c = cat(3, a, b, [ 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
数组函数
MATLAB 提供以下函数来排序、旋转、置换、重塑或移动数组内容。
函数 | 用途 |
---|---|
length | 向量或最大数组维度的长度 |
ndims | 数组维度的数量 |
numel | 数组元素的数量 |
size | 数组维度 |
iscolumn | 确定输入是否为列向量 |
isempty | 确定数组是否为空 |
ismatrix | 确定输入是否为矩阵 |
isrow | 确定输入是否为行向量 |
isscalar | 确定输入是否为标量 |
isvector | 确定输入是否为向量 |
blkdiag | 从输入参数构造块对角矩阵 |
circshift | 循环移动数组 |
ctranspose | 复共轭转置 |
diag | 对角矩阵和矩阵的对角线 |
flipdim | 沿指定维度翻转数组 |
fliplr | 从左到右翻转矩阵 |
flipud | 从上到下翻转矩阵 |
ipermute | 反转N维数组的维度 |
permute | 重新排列N维数组的维度 |
repmat | 复制和平铺数组 |
reshape | 重塑数组 |
rot90 | 将矩阵旋转90度 |
shiftdim | 移动维度 |
issorted | 确定集合元素是否按排序顺序排列 |
sort | 按升序或降序对数组元素进行排序 |
sortrows | 按升序对行进行排序 |
squeeze | 删除单一维度 |
transpose | 转置 |
vectorize | 将表达式矢量化 |
示例
以下示例说明了上面提到的某些函数。
长度、维度和元素数量−
创建一个脚本文件,并将以下代码输入其中−
x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9]; length(x) % length of x vector y = rand(3, 4, 5, 2); ndims(y) % no of dimensions in array y s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab']; numel(s) % no of elements in s
运行文件时,它会显示以下结果−
ans = 8 ans = 4 ans = 23
数组元素的循环移位−
创建一个脚本文件,并将以下代码输入其中−
a = [1 2 3; 4 5 6; 7 8 9] % the original array a b = circshift(a,1) % circular shift first dimension values down by 1. c = circshift(a,[1 -1]) % circular shift first dimension values % down by 1 % and second dimension values to the left % by 1.
运行文件时,它会显示以下结果−
a = 1 2 3 4 5 6 7 8 9 b = 7 8 9 1 2 3 4 5 6 c = 8 9 7 2 3 1 5 6 4
排序数组
创建一个脚本文件,并将以下代码输入其中−
v = [ 23 45 12 9 5 0 19 17] % horizontal vector sort(v) % sorting v m = [2 6 4; 5 3 9; 2 0 1] % two dimensional array sort(m, 1) % sorting m along the row sort(m, 2) % sorting m along the column
运行文件时,它会显示以下结果−
v = 23 45 12 9 5 0 19 17 ans = 0 5 9 12 17 19 23 45 m = 2 6 4 5 3 9 2 0 1 ans = 2 0 1 2 3 4 5 6 9 ans = 2 4 6 3 5 9 0 1 2
元胞数组
元胞数组是索引单元的数组,其中每个单元可以存储不同维度和数据类型的数组。
cell函数用于创建元胞数组。cell函数的语法为−
C = cell(dim) C = cell(dim1,...,dimN) D = cell(obj)
其中,
C是元胞数组;
dim是标量整数或整数向量,指定元胞数组C的维度;
dim1, ... , dimN是指定C维度的标量整数;
obj是以下之一−
- Java数组或对象
- .NET类型为System.String或System.Object的数组
示例
创建一个脚本文件,并将以下代码输入其中−
c = cell(2, 5); c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}
运行文件时,它会显示以下结果−
c = { [1,1] = Red [2,1] = 1 [1,2] = Blue [2,2] = 2 [1,3] = Green [2,3] = 3 [1,4] = Yellow [2,4] = 4 [1,5] = White [2,5] = 5 }
访问元胞数组中的数据
有两种方法可以引用元胞数组的元素−
- 将索引括在第一个括号()中,以引用单元集
- 将索引括在大括号{}中,以引用单个单元中的数据
当您将索引括在第一个括号中时,它指的是单元集。
圆括号中的元胞数组索引指的是单元集。
例如:
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}; c(1:2,1:2)
MATLAB将执行上述语句并返回以下结果:
ans = { [1,1] = Red [2,1] = 1 [1,2] = Blue [2,2] = 2 }
您还可以通过使用花括号索引来访问单元的内容。
例如:
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}; c{1, 2:4}
MATLAB将执行上述语句并返回以下结果:
ans = Blue ans = Green ans = Yellow
MATLAB - 冒号表示法
冒号(:)是MATLAB中最有用的运算符之一。它用于创建向量、数组下标和指定迭代。
如果要创建一个包含从1到10的整数的行向量,您可以写−
1:10
MATLAB执行该语句并返回一个包含从1到10的整数的行向量−
ans = 1 2 3 4 5 6 7 8 9 10
如果要指定除1以外的增量值,例如−
100: -5: 50
MATLAB执行该语句并返回以下结果−
ans = 100 95 90 85 80 75 70 65 60 55 50
让我们再举一个例子−
0:pi/8:pi
MATLAB执行该语句并返回以下结果−
ans = Columns 1 through 7 0 0.3927 0.7854 1.1781 1.5708 1.9635 2.3562 Columns 8 through 9 2.7489 3.1416
您可以使用冒号运算符创建索引向量以选择数组的行、列或元素。
下表描述了为此目的而使用的它(让我们有一个矩阵A)−
格式 | 用途 |
---|---|
A(:,j) | 是A的第j列。 |
A(i,:) | 是A的第i行。 |
A(:,:) | 是等效的二维数组。对于矩阵,这与A相同。 |
A(j:k) | 是A(j)、A(j+1)、...、A(k)。 |
A(:,j:k) | 是A(:,j)、A(:,j+1)、...、A(:,k)。 |
A(:,:,k) | 是三维数组A的第k页。 |
A(i,j,k,:) | 是四维数组A中的一个向量。该向量包括A(i,j,k,1)、A(i,j,k,2)、A(i,j,k,3)等。 |
A(:) | 是A的所有元素,被视为单个列。在赋值语句的左侧,A(:)填充A,保留其之前的形状。在这种情况下,右侧必须包含与A相同数量的元素。 |
示例
创建一个脚本文件,并在其中键入以下代码−
A = [1 2 3 4; 4 5 6 7; 7 8 9 10] A(:,2) % second column of A A(:,2:3) % second and third column of A A(2:3,2:3) % second and third rows and second and third columns
运行文件时,它会显示以下结果−
A = 1 2 3 4 4 5 6 7 7 8 9 10 ans = 2 5 8 ans = 2 3 5 6 8 9 ans = 5 6 8 9
MATLAB - 数字
MATLAB 支持各种数值类,包括有符号和无符号整数以及单精度和双精度浮点数。默认情况下,MATLAB 将所有数值存储为双精度浮点数。
您可以选择将任何数字或数字数组存储为整数或单精度数字。
所有数值类型都支持基本数组运算和数学运算。
转换为各种数值数据类型
MATLAB 提供以下函数来转换为各种数值数据类型−
函数 | 用途 |
---|---|
double | 转换为双精度数 |
single | 转换为单精度数 |
int8 | 转换为8位有符号整数 |
int16 | 转换为16位有符号整数 |
int32 | 转换为32位有符号整数 |
int64 | 转换为64位有符号整数 |
uint8 | 转换为8位无符号整数 |
uint16 | 转换为16位无符号整数 |
uint32 | 转换为32位无符号整数 |
uint64 | 转换为64位无符号整数 |
示例
创建一个脚本文件,并键入以下代码−
x = single([5.32 3.47 6.28]) .* 7.5 x = double([5.32 3.47 6.28]) .* 7.5 x = int8([5.32 3.47 6.28]) .* 7.5 x = int16([5.32 3.47 6.28]) .* 7.5 x = int32([5.32 3.47 6.28]) .* 7.5 x = int64([5.32 3.47 6.28]) .* 7.5
运行文件时,它会显示以下结果−
x = 39.900 26.025 47.100 x = 39.900 26.025 47.100 x = 38 23 45 x = 38 23 45 x = 38 23 45 x = 38 23 45
示例
让我们再扩展一下前面的例子。创建一个脚本文件,并键入以下代码−
x = int32([5.32 3.47 6.28]) .* 7.5 x = int64([5.32 3.47 6.28]) .* 7.5 x = num2cell(x)
运行文件时,它会显示以下结果−
x = 38 23 45 x = 38 23 45 x = { [1,1] = 38 [1,2] = 23 [1,3] = 45 }
最小和最大整数
intmax()和intmin()函数返回所有类型的整数可以表示的最大值和最小值。
这两个函数都将整数数据类型作为参数,例如intmax(int8)或intmin(int64),并返回可以使用整数数据类型表示的最大值和最小值。
示例
以下示例说明如何获取整数的最小值和最大值。创建一个脚本文件,并在其中编写以下代码−
% displaying the smallest and largest signed integer data str = 'The range for int8 is:\n\t%d to %d '; sprintf(str, intmin('int8'), intmax('int8')) str = 'The range for int16 is:\n\t%d to %d '; sprintf(str, intmin('int16'), intmax('int16')) str = 'The range for int32 is:\n\t%d to %d '; sprintf(str, intmin('int32'), intmax('int32')) str = 'The range for int64 is:\n\t%d to %d '; sprintf(str, intmin('int64'), intmax('int64')) % displaying the smallest and largest unsigned integer data str = 'The range for uint8 is:\n\t%d to %d '; sprintf(str, intmin('uint8'), intmax('uint8')) str = 'The range for uint16 is:\n\t%d to %d '; sprintf(str, intmin('uint16'), intmax('uint16')) str = 'The range for uint32 is:\n\t%d to %d '; sprintf(str, intmin('uint32'), intmax('uint32')) str = 'The range for uint64 is:\n\t%d to %d '; sprintf(str, intmin('uint64'), intmax('uint64'))
运行文件时,它会显示以下结果−
ans = The range for int8 is: -128 to 127 ans = The range for int16 is: -32768 to 32767 ans = The range for int32 is: -2147483648 to 2147483647 ans = The range for int64 is: 0 to 0 ans = The range for uint8 is: 0 to 255 ans = The range for uint16 is: 0 to 65535 ans = The range for uint32 is: 0 to -1 ans = The range for uint64 is: 0 to 18446744073709551616
最小和最大浮点数
realmax()和realmin()函数返回可以用浮点数表示的最大值和最小值。
这两个函数在使用参数'single'调用时,返回可以使用单精度数据类型表示的最大值和最小值,而在使用参数'double'调用时,返回可以使用双精度数据类型表示的最大值和最小值。
示例
以下示例说明如何获取最小和最大浮点数。创建一个脚本文件,并在其中编写以下代码−
% displaying the smallest and largest single-precision % floating point number str = 'The range for single is:\n\t%g to %g and\n\t %g to %g'; sprintf(str, -realmax('single'), -realmin('single'), ... realmin('single'), realmax('single')) % displaying the smallest and largest double-precision % floating point number str = 'The range for double is:\n\t%g to %g and\n\t %g to %g'; sprintf(str, -realmax('double'), -realmin('double'), ... realmin('double'), realmax('double'))
运行文件时,它会显示以下结果−
ans = The range for single is: -3.40282e+38 to -1.17549e-38 and 1.17549e-38 to 3.40282e+38 ans = The range for double is: -1.79769e+308 to -2.22507e-308 and 2.22507e-308 to 1.79769e+308
MATLAB - 字符串
在 MATLAB 中创建字符数组非常简单。事实上,我们已经多次使用过它。例如,您可以在命令提示符中键入以下内容:
my_string = 'Tutorials Point'
MATLAB将执行上述语句并返回以下结果:
my_string = Tutorials Point
MATLAB 将所有变量视为数组,字符串被视为字符数组。让我们使用 **whos** 命令来检查上面创建的变量:
whos
MATLAB将执行上述语句并返回以下结果:
Name Size Bytes Class Attributes my_string 1x16 32 char
有趣的是,您可以使用数值转换函数(如 **uint8** 或 **uint16**)将字符串中的字符转换为其数值代码。**char** 函数将整数向量转换回字符:
示例
创建一个脚本文件,并将以下代码输入其中−
my_string = 'Tutorial''s Point'; str_ascii = uint8(my_string) % 8-bit ascii values str_back_to_char= char(str_ascii) str_16bit = uint16(my_string) % 16-bit ascii values str_back_to_char = char(str_16bit)
运行文件时,它会显示以下结果−
str_ascii = 84 117 116 111 114 105 97 108 39 115 32 80 111 105 110 116 str_back_to_char = Tutorial's Point str_16bit = 84 117 116 111 114 105 97 108 39 115 32 80 111 105 110 116 str_back_to_char = Tutorial's Point
矩形字符数组
到目前为止,我们讨论的字符串是一维字符数组;但是,我们需要存储更多内容。我们需要在程序中存储更多维度的文本数据。这是通过创建矩形字符数组来实现的。
创建矩形字符数组最简单的方法是将两个或多个一维字符数组垂直或水平连接起来,具体取决于需要。
您可以通过以下任一方式垂直组合字符串:
使用 MATLAB 连接运算符 **[]** 并用分号 (;) 分隔每一行。请注意,在此方法中,每一行必须包含相同数量的字符。对于长度不同的字符串,应根据需要用空格字符填充。
使用 **char** 函数。如果字符串长度不同,char 会用尾随空格填充较短的字符串,以便每一行具有相同数量的字符。
示例
创建一个脚本文件,并将以下代码输入其中−
doc_profile = ['Zara Ali '; ... 'Sr. Surgeon '; ... 'R N Tagore Cardiology Research Center'] doc_profile = char('Zara Ali', 'Sr. Surgeon', ... 'RN Tagore Cardiology Research Center')
运行文件时,它会显示以下结果−
doc_profile = Zara Ali Sr. Surgeon R N Tagore Cardiology Research Center doc_profile = Zara Ali Sr. Surgeon RN Tagore Cardiology Research Center
您可以通过以下任一方式水平组合字符串:
使用 MATLAB 连接运算符 **[]** 并用逗号或空格分隔输入字符串。此方法保留输入数组中的任何尾随空格。
使用字符串连接函数 **strcat**。此方法会删除输入中的尾随空格。
示例
创建一个脚本文件,并将以下代码输入其中−
name = 'Zara Ali '; position = 'Sr. Surgeon '; worksAt = 'R N Tagore Cardiology Research Center'; profile = [name ', ' position ', ' worksAt] profile = strcat(name, ', ', position, ', ', worksAt)
运行文件时,它会显示以下结果−
profile = Zara Ali , Sr. Surgeon , R N Tagore Cardiology Research Center profile = Zara Ali,Sr. Surgeon,R N Tagore Cardiology Research Center
将字符串组合到元胞数组中
从我们之前的讨论中可以清楚地看出,组合长度不同的字符串可能很麻烦,因为数组中的所有字符串都必须具有相同的长度。我们已在字符串末尾使用空格来使它们的长度相等。
但是,组合字符串的更有效方法是将结果数组转换为元胞数组。
MATLAB 元胞数组可以在数组中保存不同大小和类型的数。元胞数组提供了一种更灵活的方式来存储不同长度的字符串。
**cellstr** 函数将字符数组转换为字符串的元胞数组。
示例
创建一个脚本文件,并将以下代码输入其中−
name = 'Zara Ali '; position = 'Sr. Surgeon '; worksAt = 'R N Tagore Cardiology Research Center'; profile = char(name, position, worksAt); profile = cellstr(profile); disp(profile)
运行文件时,它会显示以下结果−
{ [1,1] = Zara Ali [2,1] = Sr. Surgeon [3,1] = R N Tagore Cardiology Research Center }
MATLAB 中的字符串函数
MATLAB 提供了许多用于创建、组合、解析、比较和操作字符串的字符串函数。
下表简要描述了 MATLAB 中的字符串函数:
函数 | 用途 |
---|---|
用于在字符数组中存储文本、组合字符数组等的函数。 | |
blanks | 创建空格字符字符串 |
cellstr | 从字符数组创建字符串的元胞数组 |
char | 转换为字符数组(字符串) |
iscellstr | 确定输入是否为字符串的元胞数组 |
ischar | 确定项目是否为字符数组 |
sprintf | 将数据格式化为字符串 |
strcat | 水平连接字符串 |
strjoin | 将元胞数组中的字符串连接成单个字符串 |
用于识别字符串部分、查找和替换子字符串的函数 | |
ischar | 确定项目是否为字符数组 |
isletter | 字母字符的数组元素 |
isspace | 空格字符的数组元素 |
isstrprop | 确定字符串是否属于指定类别 |
sscanf | 从字符串读取格式化数据 |
strfind | 在一个字符串中查找另一个字符串 |
strrep | 查找和替换子字符串 |
strsplit | 在指定分隔符处分割字符串 |
strtok | 字符串的选定部分 |
validatestring | 检查文本字符串的有效性 |
symvar | 确定表达式中的符号变量 |
regexp | 匹配正则表达式(区分大小写) |
regexpi | 匹配正则表达式(不区分大小写) |
regexprep | 使用正则表达式替换字符串 |
regexptranslate | 将字符串转换为正则表达式 |
用于字符串比较的函数 | |
strcmp | 比较字符串(区分大小写) |
strcmpi | 比较字符串(不区分大小写) |
strncmp | 比较字符串的前 n 个字符(区分大小写) |
strncmpi | 比较字符串的前 n 个字符(不区分大小写) |
用于将字符串更改为大写或小写、创建或删除空格的函数 | |
deblank | 从字符串末尾删除尾随空格 |
strtrim | 删除字符串开头和结尾的空格 |
lower | 将字符串转换为小写 |
upper | 将字符串转换为大写 |
strjust | 调整字符数组 |
示例
以下示例说明了一些上述字符串函数:
格式化字符串
创建一个脚本文件,并将以下代码输入其中−
A = pi*1000*ones(1,5); sprintf(' %f \n %.2f \n %+.2f \n %12.2f \n %012.2f \n', A)
运行文件时,它会显示以下结果−
ans = 3141.592654 3141.59 +3141.59 3141.59 000003141.59
连接字符串
创建一个脚本文件,并将以下代码输入其中−
%cell array of strings str_array = {'red','blue','green', 'yellow', 'orange'}; % Join strings in cell array into single string str1 = strjoin(str_array, "-") str2 = strjoin(str_array, ",")
运行文件时,它会显示以下结果−
str1 = red-blue-green-yellow-orange str2 = red,blue,green,yellow,orange
查找和替换字符串
创建一个脚本文件,并将以下代码输入其中−
students = {'Zara Ali', 'Neha Bhatnagar', ... 'Monica Malik', 'Madhu Gautam', ... 'Madhu Sharma', 'Bhawna Sharma',... 'Nuha Ali', 'Reva Dutta', ... 'Sunaina Ali', 'Sofia Kabir'}; % The strrep function searches and replaces sub-string. new_student = strrep(students(8), 'Reva', 'Poulomi') % Display first names first_names = strtok(students)
运行文件时,它会显示以下结果−
new_student = { [1,1] = Poulomi Dutta } first_names = { [1,1] = Zara [1,2] = Neha [1,3] = Monica [1,4] = Madhu [1,5] = Madhu [1,6] = Bhawna [1,7] = Nuha [1,8] = Reva [1,9] = Sunaina [1,10] = Sofia }
比较字符串
创建一个脚本文件,并将以下代码输入其中−
str1 = 'This is test' str2 = 'This is text' if (strcmp(str1, str2)) sprintf('%s and %s are equal', str1, str2) else sprintf('%s and %s are not equal', str1, str2) end
运行文件时,它会显示以下结果−
str1 = This is test str2 = This is text ans = This is test and This is text are not equal
MATLAB - 函数
函数是一组一起执行任务的语句。在 MATLAB 中,函数在单独的文件中定义。文件和函数的名称应相同。
函数在其自己的工作区(也称为 **局部工作区**)中操作变量,该工作区与您在 MATLAB 命令提示符下访问的工作区(称为 **基本工作区**)分开。
函数可以接受多个输入参数,并且可以返回多个输出参数。
函数语句的语法为:
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
示例
名为 *mymax* 的以下函数应写入名为 *mymax.m* 的文件中。它以五个数字作为参数,并返回这些数字中的最大值。
创建一个名为 mymax.m 的函数文件,并在其中键入以下代码:
function max = mymax(n1, n2, n3, n4, n5) %This function calculates the maximum of the % five numbers given as input max = n1; if(n2 > max) max = n2; end if(n3 > max) max = n3; end if(n4 > max) max = n4; end if(n5 > max) max = n5; end
函数的第一行以关键字 **function** 开头。它给出函数的名称和参数的顺序。在我们的示例中,*mymax* 函数有五个输入参数和一个输出参数。
紧跟在函数语句之后的注释行提供帮助文本。当您键入以下内容时,将打印这些行:
help mymax
MATLAB将执行上述语句并返回以下结果:
This function calculates the maximum of the five numbers given as input
您可以这样调用函数:
mymax(34, 78, 89, 23, 11)
MATLAB将执行上述语句并返回以下结果:
ans = 89
匿名函数
匿名函数类似于传统编程语言中的内联函数,在单个 MATLAB 语句中定义。它包含一个 MATLAB 表达式和任意数量的输入和输出参数。
您可以在 MATLAB 命令行或函数或脚本中定义匿名函数。
这样,您就可以创建简单的函数,而无需为它们创建文件。
从表达式创建匿名函数的语法为
f = @(arglist)expression
示例
在此示例中,我们将编写一个名为 power 的匿名函数,它将以两个数字作为输入,并返回第一个数字的第二个数字次幂。
创建一个脚本文件,并在其中键入以下代码−
power = @(x, n) x.^n; result1 = power(7, 3) result2 = power(49, 0.5) result3 = power(10, -10) result4 = power (4.5, 1.5)
运行文件时,它会显示−
result1 = 343 result2 = 7 result3 = 1.0000e-10 result4 = 9.5459
主函数和子函数
除匿名函数之外的任何函数都必须在文件中定义。每个函数文件都包含一个必需的主函数(首先出现)和任意数量的可选子函数(出现在主函数之后并由其使用)。
主函数可以从定义它们的外部文件调用,无论是从命令行还是从其他函数调用,但子函数不能从命令行或其他函数调用,不能在函数文件外部调用。
子函数仅对定义它们的函数文件中的主函数和其他子函数可见。
示例
让我们编写一个名为 quadratic 的函数,该函数将计算二次方程的根。该函数将接收三个输入,即二次系数、线性系数和常数项。它将返回根。
函数文件 quadratic.m 将包含主函数 *quadratic* 和子函数 *disc*,后者计算判别式。
创建一个函数文件 *quadratic.m*,并在其中键入以下代码:
function [x1,x2] = quadratic(a,b,c) %this function returns the roots of % a quadratic equation. % It takes 3 input arguments % which are the co-efficients of x2, x and the %constant term % It returns the roots d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end % end of quadratic function dis = disc(a,b,c) %function calculates the discriminant dis = sqrt(b^2 - 4*a*c); end % end of sub-function
您可以从命令提示符处调用上述函数,如下所示:
quadratic(2,4,-4)
MATLAB将执行上述语句并返回以下结果:
ans = 0.7321
嵌套函数
您可以在另一个函数的主体中定义函数。这些称为嵌套函数。嵌套函数包含任何其他函数的任何或所有组件。
嵌套函数在另一个函数的作用域内定义,并且它们共享对包含函数工作区的访问权限。
嵌套函数遵循以下语法:
function x = A(p1, p2) ... B(p2) function y = B(p3) ... end ... end
示例
让我们重写上一个示例中的 *quadratic* 函数,但是,这次 disc 函数将是一个嵌套函数。
创建一个函数文件 *quadratic2.m*,并在其中键入以下代码:
function [x1,x2] = quadratic2(a,b,c) function disc % nested function d = sqrt(b^2 - 4*a*c); end % end of function disc disc; x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end % end of function quadratic2
您可以从命令提示符处调用上述函数,如下所示:
quadratic2(2,4,-4)
MATLAB将执行上述语句并返回以下结果:
ans = 0.73205
私有函数
私有函数是一个主函数,它仅对有限数量的其他函数可见。如果您不想公开函数的实现,则可以将其创建为私有函数。
私有函数驻留在名称为 **private** 的 **子文件夹** 中。
它们仅对父文件夹中的函数可见。
示例
让我们重写 *quadratic* 函数。但是,这次计算判别式的 *disc* 函数将是一个私有函数。
在工作目录中创建一个名为 private 的子文件夹。将以下函数文件 *disc.m* 存储在其中:
function dis = disc(a,b,c) %function calculates the discriminant dis = sqrt(b^2 - 4*a*c); end % end of sub-function
在您的工作目录中创建一个函数 quadratic3.m,并在其中键入以下代码:
function [x1,x2] = quadratic3(a,b,c) %this function returns the roots of % a quadratic equation. % It takes 3 input arguments % which are the co-efficient of x2, x and the %constant term % It returns the roots d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end % end of quadratic3
您可以从命令提示符处调用上述函数,如下所示:
quadratic3(2,4,-4)
MATLAB将执行上述语句并返回以下结果:
ans = 0.73205
全局变量
全局变量可以被多个函数共享。为此,您需要在所有函数中将变量声明为全局变量。
如果要从基本工作区访问该变量,则在命令行中声明该变量。
全局声明必须在函数中实际使用变量之前发生。最好对全局变量的名称使用大写字母,以将其与其他变量区分开来。
示例
让我们创建一个名为 average.m 的函数文件,并在其中键入以下代码:
function avg = average(nums) global TOTAL avg = sum(nums)/TOTAL; end
创建一个脚本文件,并在其中键入以下代码−
global TOTAL; TOTAL = 10; n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42]; av = average(n)
运行该文件时,它将显示以下结果:
av = 35.500
MATLAB - 数据导入
在 MATLAB 中导入数据意味着从外部文件加载数据。**importdata** 函数允许加载各种不同格式的数据文件。它具有以下五种形式:
序号 | 函数 & 描述 |
---|---|
1 |
A = importdata(filename) 从 *filename* 表示的文件将数据加载到数组 A 中。 |
2 |
A = importdata('-pastespecial') 从系统剪贴板而不是从文件加载数据。 |
3 |
A = importdata(___, delimiterIn) 将 *delimiterIn* 解释为 ASCII 文件、filename 或剪贴板数据中的列分隔符。您可以将 *delimiterIn* 与上述语法中的任何输入参数一起使用。 |
4 |
A = importdata(___, delimiterIn, headerlinesIn) 从 ASCII 文件、filename 或剪贴板加载数据,从第 *headerlinesIn+1* 行开始读取数值数据。 |
5 |
[A, delimiterOut, headerlinesOut] = importdata(___) 使用先前语法中的任何输入参数,在 *delimiterOut* 中返回输入 ASCII 文件的检测到的分隔符字符,并在 *headerlinesOut* 中返回检测到的标题行数。 |
默认情况下,Octave 不支持 *importdata()* 函数,因此您需要搜索并安装此软件包才能使以下示例与您的 Octave 安装一起使用。
示例 1
让我们加载并显示一个图像文件。创建一个脚本文件,并在其中键入以下代码:
filename = 'smile.jpg'; A = importdata(filename); image(A);
运行该文件时,MATLAB 会显示图像文件。但是,您必须将其存储在当前目录中。
示例 2
在此示例中,我们导入一个文本文件并指定分隔符和列标题。让我们创建一个以空格分隔的带列标题的 ASCII 文件,命名为 *weeklydata.txt*。
我们的文本文件 weeklydata.txt 如下所示:
SunDay MonDay TuesDay WednesDay ThursDay FriDay SaturDay 95.01 76.21 61.54 40.57 55.79 70.28 81.53 73.11 45.65 79.19 93.55 75.29 69.87 74.68 60.68 41.85 92.18 91.69 81.32 90.38 74.51 48.60 82.14 73.82 41.03 0.99 67.22 93.18 89.13 44.47 57.63 89.36 13.89 19.88 46.60
创建一个脚本文件,并在其中键入以下代码−
filename = 'weeklydata.txt'; delimiterIn = ' '; headerlinesIn = 1; A = importdata(filename,delimiterIn,headerlinesIn); % View data for k = [1:7] disp(A.colheaders{1, k}) disp(A.data(:, k)) disp(' ') end
运行文件时,它会显示以下结果−
SunDay 95.0100 73.1100 60.6800 48.6000 89.1300 MonDay 76.2100 45.6500 41.8500 82.1400 44.4700 TuesDay 61.5400 79.1900 92.1800 73.8200 57.6300 WednesDay 40.5700 93.5500 91.6900 41.0300 89.3600 ThursDay 55.7900 75.2900 81.3200 0.9900 13.8900 FriDay 70.2800 69.8700 90.3800 67.2200 19.8800 SaturDay 81.5300 74.6800 74.5100 93.1800 46.6000
示例 3
在此示例中,让我们从剪贴板导入数据。
将以下行复制到剪贴板:
数学很简单
创建一个脚本文件,并键入以下代码−
A = importdata('-pastespecial')
运行文件时,它会显示以下结果−
A = 'Mathematics is simple'
低级文件 I/O
importdata 函数是一个高级函数。MATLAB 中的低级文件 I/O 函数允许对读取或写入文件的数据进行最精细的控制。但是,这些函数需要有关文件的更多详细信息才能有效地工作。
MATLAB 提供以下函数用于字节或字符级别的读写操作:
函数 | 描述 |
---|---|
fclose | 关闭一个或所有打开的文件 |
feof | 测试文件结束 |
ferror | 文件 I/O 错误信息 |
fgetl | 从文件中读取一行,删除换行符 |
fgets | 从文件中读取一行,保留换行符 |
fopen | 打开文件或获取有关打开文件的信息 |
fprintf | 将数据写入文本文件 |
fread | 从二进制文件读取数据 |
frewind | 将文件位置指示器移动到打开文件的开头 |
fscanf | 从文本文件读取数据 |
fseek | 移动到文件中的指定位置 |
ftell | 打开文件中的位置 |
fwrite | 将数据写入二进制文件 |
使用低级 I/O 导入文本数据文件
MATLAB 提供以下函数用于文本数据文件的低级导入:
fscanf 函数读取文本或 ASCII 文件中的格式化数据。
fgetl 和 fgets 函数每次读取文件的一行,其中换行符分隔每一行。
fread 函数以字节或位级别读取数据流。
示例
我们在工作目录中保存了一个名为“myfile.txt”的文本数据文件。该文件存储了 2012 年 6 月、7 月和 8 月三个月的降雨数据。
myfile.txt 中的数据包含五个地点重复的时间、月份和降雨量测量值集。标题数据存储月份数 M;因此我们有 M 个测量值集。
文件如下所示:
Rainfall Data Months: June, July, August M = 3 12:00:00 June-2012 17.21 28.52 39.78 16.55 23.67 19.15 0.35 17.57 NaN 12.01 17.92 28.49 17.40 17.06 11.09 9.59 9.33 NaN 0.31 0.23 10.46 13.17 NaN 14.89 19.33 20.97 19.50 17.65 14.45 14.00 18.23 10.34 17.95 16.46 19.34 09:10:02 July-2012 12.76 16.94 14.38 11.86 16.89 20.46 23.17 NaN 24.89 19.33 30.97 49.50 47.65 24.45 34.00 18.23 30.34 27.95 16.46 19.34 30.46 33.17 NaN 34.89 29.33 30.97 49.50 47.65 24.45 34.00 28.67 30.34 27.95 36.46 29.34 15:03:40 August-2012 17.09 16.55 19.59 17.25 19.22 17.54 11.45 13.48 22.55 24.01 NaN 21.19 25.85 25.05 27.21 26.79 24.98 12.23 16.99 18.67 17.54 11.45 13.48 22.55 24.01 NaN 21.19 25.85 25.05 27.21 26.79 24.98 12.23 16.99 18.67
我们将从该文件导入数据并显示此数据。请执行以下步骤:
使用 fopen 函数打开文件并获取文件标识符。
使用 格式说明符(例如字符串的“%s”、整数的“%d”或浮点数的“%f”)描述文件中的数据。
要跳过文件中的文字字符,请将它们包含在格式描述中。要跳过数据字段,请在说明符中使用星号(“*”)。
例如,要读取标题并返回 M 的单个值,我们编写:
M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1);
默认情况下,fscanf 会根据我们的格式描述读取数据,直到它找不到任何匹配的数据,或者到达文件末尾。这里我们将使用 for 循环读取 3 组数据,每次读取 7 行 5 列。
我们将在工作区中创建一个名为 mydata 的结构来存储从文件中读取的数据。该结构具有三个字段 - time、month 和 raindata 数组。
创建一个脚本文件,并在其中键入以下代码−
filename = '/data/myfile.txt'; rows = 7; cols = 5; % open the file fid = fopen(filename); % read the file headers, find M (number of months) M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1); % read each set of measurements for n = 1:M mydata(n).time = fscanf(fid, '%s', 1); mydata(n).month = fscanf(fid, '%s', 1); % fscanf fills the array in column order, % so transpose the results mydata(n).raindata = ... fscanf(fid, '%f', [rows, cols]); end for n = 1:M disp(mydata(n).time), disp(mydata(n).month) disp(mydata(n).raindata) end % close the file fclose(fid);
运行文件时,它会显示以下结果−
12:00:00 June-2012 17.2100 17.5700 11.0900 13.1700 14.4500 28.5200 NaN 9.5900 NaN 14.0000 39.7800 12.0100 9.3300 14.8900 18.2300 16.5500 17.9200 NaN 19.3300 10.3400 23.6700 28.4900 0.3100 20.9700 17.9500 19.1500 17.4000 0.2300 19.5000 16.4600 0.3500 17.0600 10.4600 17.6500 19.3400 09:10:02 July-2012 12.7600 NaN 34.0000 33.1700 24.4500 16.9400 24.8900 18.2300 NaN 34.0000 14.3800 19.3300 30.3400 34.8900 28.6700 11.8600 30.9700 27.9500 29.3300 30.3400 16.8900 49.5000 16.4600 30.9700 27.9500 20.4600 47.6500 19.3400 49.5000 36.4600 23.1700 24.4500 30.4600 47.6500 29.3400 15:03:40 August-2012 17.0900 13.4800 27.2100 11.4500 25.0500 16.5500 22.5500 26.7900 13.4800 27.2100 19.5900 24.0100 24.9800 22.5500 26.7900 17.2500 NaN 12.2300 24.0100 24.9800 19.2200 21.1900 16.9900 NaN 12.2300 17.5400 25.8500 18.6700 21.1900 16.9900 11.4500 25.0500 17.5400 25.8500 18.6700
MATLAB - 数据输出
MATLAB 中的数据导出(或输出)意味着写入文件。MATLAB 允许您在读取 ASCII 文件的其他应用程序中使用您的数据。为此,MATLAB 提供了多种数据导出选项。
您可以创建以下类型的文件:
来自数组的矩形、分隔的 ASCII 数据文件。
键击和生成的文本输出的日记(或日志)文件。
使用低级函数(如 fprintf)的专用 ASCII 文件。
MEX 文件以访问写入特定文本文件格式的 C/C++ 或 Fortran 例程。
除此之外,您还可以将数据导出到电子表格。
有两种方法可以将数值数组导出为分隔的 ASCII 数据文件:
使用 save 函数并指定 -ascii 限定符
使用 dlmwrite 函数
使用 save 函数的语法为:
save my_data.out num_array -ascii
其中,my_data.out 是创建的分隔的 ASCII 数据文件,num_array 是数值数组,−ascii 是说明符。
使用 dlmwrite 函数的语法为:
dlmwrite('my_data.out', num_array, 'dlm_char')
其中,my_data.out 是创建的分隔的 ASCII 数据文件,num_array 是数值数组,dlm_char 是分隔符字符。
示例
以下示例演示了该概念。创建一个脚本文件并键入以下代码:
num_array = [ 1 2 3 4 ; 4 5 6 7; 7 8 9 0]; save array_data1.out num_array -ascii; type array_data1.out dlmwrite('array_data2.out', num_array, ' '); type array_data2.out
运行文件时,它会显示以下结果−
1.0000000e+00 2.0000000e+00 3.0000000e+00 4.0000000e+00 4.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 9.0000000e+00 0.0000000e+00 1 2 3 4 4 5 6 7 7 8 9 0
请注意,save -ascii 命令和 dlmwrite 函数不适用于单元数组作为输入。要从单元数组的内容创建分隔的 ASCII 文件,您可以
或者,使用 cell2mat 函数将单元数组转换为矩阵
或者使用低级文件 I/O 函数导出单元数组。
如果使用 save 函数将字符数组写入 ASCII 文件,它会将字符的 ASCII 等效项写入文件。
例如,让我们将单词“hello”写入文件:
h = 'hello'; save textdata.out h -ascii type textdata.out
MATLAB 执行上述语句并显示以下结果。即字符串“hello”的字符以 8 位 ASCII 格式显示。
1.0400000e+02 1.0100000e+02 1.0800000e+02 1.0800000e+02 1.1100000e+02
写入日记文件
日记文件是 MATLAB 会话的活动日志。diary 函数在磁盘文件中创建会话的精确副本,但不包括图形。
要打开 diary 函数,请键入:
diary
可选地,您可以给出日志文件的名称,例如:
diary logdata.out
要关闭 diary 函数:
diary off
您可以在文本编辑器中打开日记文件。
使用低级 I/O 将数据导出到文本数据文件
到目前为止,我们已经导出了数值数组。但是,您可能需要创建其他文本文件,包括数值和字符数据的组合、非矩形输出文件或使用非 ASCII 编码方案的文件。为此,MATLAB 提供了低级 fprintf 函数。
与低级 I/O 文件活动一样,在导出之前,您需要使用 fopen 函数打开或创建文件并获取文件标识符。默认情况下,fopen 以只读方式打开文件。您应该指定写入或追加的权限,例如“w”或“a”。
处理完文件后,您需要使用 fclose(fid) 函数关闭它。
以下示例演示了该概念:
示例
创建一个脚本文件,并在其中键入以下代码−
% create a matrix y, with two rows x = 0:10:100; y = [x; log(x)]; % open a file for writing fid = fopen('logtable.txt', 'w'); % Table Header fprintf(fid, 'Log Function\n\n'); % print values in column order % two values appear on each row of the file fprintf(fid, '%f %f\n', y); fclose(fid); % display the file created type logtable.txt
运行文件时,它会显示以下结果−
Log Function 0.000000 -Inf 10.000000 2.302585 20.000000 2.995732 30.000000 3.401197 40.000000 3.688879 50.000000 3.912023 60.000000 4.094345 70.000000 4.248495 80.000000 4.382027 90.000000 4.499810 100.000000 4.605170
MATLAB - 绘图
要绘制函数的图形,您需要执行以下步骤:
定义 x,指定变量 x 的 值范围,在此范围内要绘制函数
定义函数 y = f(x)
调用 plot 命令,如 plot(x, y)
以下示例将演示该概念。让我们绘制从 0 到 100 的 x 值范围内的简单函数 y = x,增量为 5。
创建一个脚本文件,并键入以下代码−
x = [0:5:100]; y = x; plot(x, y)
运行文件时,MATLAB 将显示以下图形:
让我们再举一个绘制函数 y = x2 的例子。在此示例中,我们将绘制两个具有相同函数的图形,但在第二次绘制时,我们将减少增量值。请注意,随着我们减少增量,图形变得更平滑。
创建一个脚本文件,并键入以下代码−
x = [1 2 3 4 5 6 7 8 9 10]; x = [-100:20:100]; y = x.^2; plot(x, y)
运行文件时,MATLAB 将显示以下图形:
稍微修改代码文件,将增量减少到 5:
x = [-100:5:100]; y = x.^2; plot(x, y)
MATLAB 绘制了一个更平滑的图形:
在图形上添加标题、标签、网格线和缩放
MATLAB 允许您添加标题、沿 x 轴和 y 轴的标签、网格线以及调整轴以美化图形。
xlabel 和 ylabel 命令在 x 轴和 y 轴上生成标签。
title 命令允许您在图形上放置标题。
grid on 命令允许您在图形上放置网格线。
axis equal 命令允许使用相同的比例因子和两个轴上的空间生成图形。
axis square 命令生成一个正方形图形。
示例
创建一个脚本文件,并键入以下代码−
x = [0:0.01:10]; y = sin(x); plot(x, y), xlabel('x'), ylabel('Sin(x)'), title('Sin(x) Graph'), grid on, axis equal
MATLAB 生成以下图形:
在同一图形上绘制多个函数
您可以在同一图形上绘制多个图形。以下示例演示了该概念:
示例
创建一个脚本文件,并键入以下代码−
x = [0 : 0.01: 10]; y = sin(x); g = cos(x); plot(x, y, x, g, '.-'), legend('Sin(x)', 'Cos(x)')
MATLAB 生成以下图形:
在图形上设置颜色
MATLAB 提供了八种基本颜色选项用于绘制图形。下表显示了颜色及其代码:
代码 | 颜色 |
---|---|
w | 白色 |
k | 黑色 |
b | 蓝色 |
r | 红色 |
c | 青色 |
g | 绿色 |
m | 品红色 |
y | 黄色 |
示例
让我们绘制两个多项式的图形
f(x) = 3x4 + 2x3+ 7x2 + 2x + 9 和
g(x) = 5x3 + 9x + 2
创建一个脚本文件,并键入以下代码−
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')
运行文件时,MATLAB 将生成以下图形:
设置轴刻度
axis 命令允许您设置轴刻度。您可以使用以下方式的 axis 命令为 x 轴和 y 轴提供最小值和最大值:
axis ( [xmin xmax ymin ymax] )
以下示例说明了这一点:
示例
创建一个脚本文件,并键入以下代码−
x = [0 : 0.01: 10]; y = exp(-x).* sin(2*x + 3); plot(x, y), axis([0 10 -1 1])
运行文件时,MATLAB 将生成以下图形:
生成子图
当您在同一图形中创建一系列图形时,这些图形中的每一个都称为子图。subplot 命令用于创建子图。
该命令的语法为:
subplot(m, n, p)
其中,m 和 n 是图形数组的行数和列数,p 指定放置特定图形的位置。
使用 subplot 命令创建的每个图形都可以具有自己的特性。以下示例演示了该概念:
示例
让我们生成两个图形:
y = e−1.5xsin(10x)
y = e−2xsin(10x)
创建一个脚本文件,并键入以下代码−
x = [0:0.01:5]; y = exp(-1.5*x).*sin(10*x); subplot(1,2,1) plot(x,y), xlabel('x'),ylabel('exp(–1.5x)*sin(10x)'),axis([0 5 -1 1]) y = exp(-2*x).*sin(10*x); subplot(1,2,2) plot(x,y),xlabel('x'),ylabel('exp(–2x)*sin(10x)'),axis([0 5 -1 1])
运行文件时,MATLAB 将生成以下图形:
MATLAB - 图形
本章将继续探索 MATLAB 的绘图和图形功能。我们将讨论:
- 绘制条形图
- 绘制等值线
- 三维图形
绘制条形图
bar 命令绘制二维条形图。让我们举一个例子来演示这个想法。
示例
让我们假设一个有 10 名学生的虚拟教室。我们知道这些学生获得的分数百分比分别为 75、58、90、87、50、85、92、75、60 和 95。我们将为这些数据绘制条形图。
创建一个脚本文件,并键入以下代码−
x = [1:10]; y = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95]; bar(x,y), xlabel('Student'),ylabel('Score'), title('First Sem:') print -deps graph.eps
运行文件时,MATLAB 将显示以下条形图:
绘制等值线
双变量函数的等值线是函数具有恒定值的曲线。等值线用于通过连接高于给定水平(例如平均海平面)的相同高度的点来创建等高线图。
MATLAB 提供了一个 contour 函数用于绘制等高线图。
示例
让我们生成一个等高线图,显示给定函数 g = f(x, y) 的等值线。此函数有两个变量。因此,我们将不得不生成两个自变量,即两个数据集 x 和 y。这是通过调用 meshgrid 命令完成的。
meshgrid 命令用于生成元素矩阵,这些元素给出 x 和 y 上的范围以及每种情况下增量的规范。
让我们绘制我们的函数 g = f(x, y),其中 −5 ≤ x ≤ 5,−3 ≤ y ≤ 3。让我们为这两个值取 0.1 的增量。变量设置为:
[x,y] = meshgrid(–5:0.1:5, –3:0.1:3);
最后,我们需要分配函数。让我们的函数为:x2 + y2
创建一个脚本文件,并键入以下代码−
[x,y] = meshgrid(-5:0.1:5,-3:0.1:3); %independent variables g = x.^2 + y.^2; % our function contour(x,y,g) % call the contour function print -deps graph.eps
运行文件时,MATLAB 将显示以下等高线图:
让我们稍微修改一下代码以美化地图
[x,y] = meshgrid(-5:0.1:5,-3:0.1:3); %independent variables g = x.^2 + y.^2; % our function [C, h] = contour(x,y,g); % call the contour function set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2) print -deps graph.eps
运行文件时,MATLAB 将显示以下等高线图:
三维图形
三维图形基本上显示由双变量函数 g = f (x,y) 定义的曲面。
和之前一样,为了定义g,我们首先使用**meshgrid**命令在函数的定义域上创建一组(x,y)点。接下来,我们赋值给函数本身。最后,我们使用**surf**命令创建一个曲面图。
以下示例演示了该概念:
示例
让我们为函数g = xe-(x2 + y2)创建一个3D曲面图。
创建一个脚本文件,并键入以下代码−
[x,y] = meshgrid(-2:.2:2); g = x .* exp(-x.^2 - y.^2); surf(x, y, g) print -deps graph.eps
当你运行文件时,MATLAB将显示以下3D图 -
你也可以使用**mesh**命令生成三维曲面。但是,**surf**命令以彩色显示连接线和曲面的面,而**mesh**命令创建一个线框曲面,用彩色线连接定义点。
MATLAB - 代数
到目前为止,我们已经看到所有示例都可以在MATLAB及其GNU版本(也称为Octave)中运行。但是对于求解基本代数方程,MATLAB和Octave略有不同,因此我们将尝试在单独的部分中介绍MATLAB和Octave。
我们还将讨论代数表达式的因式分解和化简。
在MATLAB中求解基本代数方程
**solve**函数用于求解代数方程。在其最简单的形式中,solve函数将用引号括起来的方程作为参数。
例如,让我们求解方程x-5 = 0中的x。
solve('x-5=0')
MATLAB将执行上述语句并返回以下结果:
ans = 5
你也可以这样调用solve函数 -
y = solve('x-5 = 0')
MATLAB将执行上述语句并返回以下结果:
y = 5
你甚至可以不包含方程的右侧 -
solve('x-5')
MATLAB将执行上述语句并返回以下结果:
ans = 5
如果方程包含多个符号,那么MATLAB默认情况下假设你正在求解x,但是,solve函数还有另一种形式 -
solve(equation, variable)
其中,你也可以提及变量。
例如,让我们求解方程v – u – 3t2 = 0关于v的解。在这种情况下,我们应该写 -
solve('v-u-3*t^2=0', 'v')
MATLAB将执行上述语句并返回以下结果:
ans = 3*t^2 + u
在Octave中求解基本代数方程
**roots**函数用于在Octave中求解代数方程,你可以将上述示例写成如下形式 -
例如,让我们求解方程x-5 = 0中的x。
roots([1, -5])
Octave将执行上述语句并返回以下结果 -
ans = 5
你也可以这样调用solve函数 -
y = roots([1, -5])
Octave将执行上述语句并返回以下结果 -
y = 5
在MATLAB中求解二次方程
**solve**函数也可以求解高阶方程。它通常用于求解二次方程。该函数将方程的根返回到一个数组中。
以下示例求解二次方程x2 -7x +12 = 0。创建一个脚本文件并输入以下代码 -
eq = 'x^2 -7*x + 12 = 0'; s = solve(eq); disp('The first root is: '), disp(s(1)); disp('The second root is: '), disp(s(2));
运行文件时,它会显示以下结果−
The first root is: 3 The second root is: 4
在Octave中求解二次方程
以下示例在Octave中求解二次方程x2 -7x +12 = 0。创建一个脚本文件并输入以下代码 -
s = roots([1, -7, 12]); disp('The first root is: '), disp(s(1)); disp('The second root is: '), disp(s(2));
运行文件时,它会显示以下结果−
The first root is: 4 The second root is: 3
在MATLAB中求解高阶方程
**solve**函数也可以求解高阶方程。例如,让我们求解三次方程(x-3)2(x-7) = 0。
solve('(x-3)^2*(x-7)=0')
MATLAB将执行上述语句并返回以下结果:
ans = 3 3 7
对于高阶方程,根很长,包含很多项。你可以通过将它们转换为double来获取这些根的数值。以下示例求解四次方程x4 − 7x3 + 3x2 − 5x + 9 = 0。
创建一个脚本文件,并键入以下代码−
eq = 'x^4 - 7*x^3 + 3*x^2 - 5*x + 9 = 0'; s = solve(eq); disp('The first root is: '), disp(s(1)); disp('The second root is: '), disp(s(2)); disp('The third root is: '), disp(s(3)); disp('The fourth root is: '), disp(s(4)); % converting the roots to double type disp('Numeric value of first root'), disp(double(s(1))); disp('Numeric value of second root'), disp(double(s(2))); disp('Numeric value of third root'), disp(double(s(3))); disp('Numeric value of fourth root'), disp(double(s(4)));
当你运行文件时,它将返回以下结果 -
The first root is: 6.630396332390718431485053218985 The second root is: 1.0597804633025896291682772499885 The third root is: - 0.34508839784665403032666523448675 - 1.0778362954630176596831109269793*i The fourth root is: - 0.34508839784665403032666523448675 + 1.0778362954630176596831109269793*i Numeric value of first root 6.6304 Numeric value of second root 1.0598 Numeric value of third root -0.3451 - 1.0778i Numeric value of fourth root -0.3451 + 1.0778i
请注意,最后两个根是复数。
在Octave中求解高阶方程
以下示例求解四次方程x4 − 7x3 + 3x2 − 5x + 9 = 0。
创建一个脚本文件,并键入以下代码−
v = [1, -7, 3, -5, 9]; s = roots(v); % converting the roots to double type disp('Numeric value of first root'), disp(double(s(1))); disp('Numeric value of second root'), disp(double(s(2))); disp('Numeric value of third root'), disp(double(s(3))); disp('Numeric value of fourth root'), disp(double(s(4)));
当你运行文件时,它将返回以下结果 -
Numeric value of first root 6.6304 Numeric value of second root -0.34509 + 1.07784i Numeric value of third root -0.34509 - 1.07784i Numeric value of fourth root 1.0598
在MATLAB中求解方程组
**solve**函数还可以用来生成包含多个变量的方程组的解。让我们举一个简单的例子来演示这种用法。
让我们求解以下方程 -
5x + 9y = 5
3x – 6y = 4
创建一个脚本文件,并键入以下代码−
s = solve('5*x + 9*y = 5','3*x - 6*y = 4'); s.x s.y
运行文件时,它会显示以下结果−
ans = 22/19 ans = -5/57
同样地,你可以求解更大的线性系统。考虑以下方程组 -
x + 3y -2z = 5
3x + 5y + 6z = 7
2x + 4y + 3z = 8
在Octave中求解方程组
我们有一个稍微不同的方法来求解'n'个未知数的'n'个线性方程组。让我们举一个简单的例子来演示这种用法。
让我们求解以下方程 -
5x + 9y = 5
3x – 6y = 4
这样的线性方程组可以写成单个矩阵方程Ax = b,其中A是系数矩阵,b是包含线性方程右侧的列向量,x是表示解的列向量,如下面的程序所示 -
创建一个脚本文件,并键入以下代码−
A = [5, 9; 3, -6]; b = [5;4]; A \ b
运行文件时,它会显示以下结果−
ans = 1.157895 -0.087719
同样地,你可以求解如下所示的更大的线性系统 -
x + 3y -2z = 5
3x + 5y + 6z = 7
2x + 4y + 3z = 8
在MATLAB中展开和收集方程
**expand**和**collect**函数分别展开和收集方程。以下示例演示了这些概念 -
当你使用许多符号函数时,你应该声明你的变量是符号变量。
创建一个脚本文件,并键入以下代码−
syms x %symbolic variable x syms y %symbolic variable x % expanding equations expand((x-5)*(x+9)) expand((x+2)*(x-3)*(x-5)*(x+7)) expand(sin(2*x)) expand(cos(x+y)) % collecting equations collect(x^3 *(x-7)) collect(x^4*(x-3)*(x-5))
运行文件时,它会显示以下结果−
ans = x^2 + 4*x - 45 ans = x^4 + x^3 - 43*x^2 + 23*x + 210 ans = 2*cos(x)*sin(x) ans = cos(x)*cos(y) - sin(x)*sin(y) ans = x^4 - 7*x^3 ans = x^6 - 8*x^5 + 15*x^4
在Octave中展开和收集方程
你需要安装**symbolic**包,它提供了**expand**和**collect**函数,分别用于展开和收集方程。以下示例演示了这些概念 -
当你使用许多符号函数时,你应该声明你的变量是符号变量,但Octave定义符号变量的方法不同。注意**Sin**和**Cos**的使用,它们也在symbolic包中定义。
创建一个脚本文件,并键入以下代码−
% first of all load the package, make sure its installed. pkg load symbolic % make symbols module available symbols % define symbolic variables x = sym ('x'); y = sym ('y'); z = sym ('z'); % expanding equations expand((x-5)*(x+9)) expand((x+2)*(x-3)*(x-5)*(x+7)) expand(Sin(2*x)) expand(Cos(x+y)) % collecting equations collect(x^3 *(x-7), z) collect(x^4*(x-3)*(x-5), z)
运行文件时,它会显示以下结果−
ans = -45.0+x^2+(4.0)*x ans = 210.0+x^4-(43.0)*x^2+x^3+(23.0)*x ans = sin((2.0)*x) ans = cos(y+x) ans = x^(3.0)*(-7.0+x) ans = (-3.0+x)*x^(4.0)*(-5.0+x)
代数表达式的因式分解和化简
**factor**函数对表达式进行因式分解,**simplify**函数对表达式进行化简。以下示例演示了这个概念 -
示例
创建一个脚本文件,并键入以下代码−
syms x syms y factor(x^3 - y^3) factor([x^2-y^2,x^3+y^3]) simplify((x^4-16)/(x^2-4))
运行文件时,它会显示以下结果−
ans = (x - y)*(x^2 + x*y + y^2) ans = [ (x - y)*(x + y), (x + y)*(x^2 - x*y + y^2)] ans = x^2 + 4
MATLAB - 微积分
MATLAB提供了多种方法来解决微积分问题,求解任意阶的微分方程以及计算极限。最棒的是,你可以轻松地绘制复杂函数的图形,并通过求解原始函数及其导数来检查图形上的最大值、最小值和其他驻点。
本章将讨论微积分问题。在本章中,我们将讨论预备微积分的概念,即计算函数的极限并验证极限的性质。
在下一章“微分”中,我们将计算表达式的导数,并在图形上找到局部最大值和最小值。我们还将讨论求解微分方程。
最后,在“积分”一章中,我们将讨论积分学。
计算极限
MATLAB提供了**limit**函数用于计算极限。在其最基本的形式中,**limit**函数将表达式作为参数,并找到当自变量趋于零时表达式的极限。
例如,让我们计算函数f(x) = (x3 + 5)/(x4 + 7)在x趋于零时的极限。
syms x limit((x^3 + 5)/(x^4 + 7))
MATLAB将执行上述语句并返回以下结果:
ans = 5/7
limit函数属于符号计算的范畴;你需要使用**syms**函数来告诉MATLAB你正在使用哪些符号变量。你还可以计算函数的极限,当变量趋于某个非零数时。为了计算lim x->a(f(x)),我们使用带有参数的limit命令。第一个是表达式,第二个是x接近的数字,这里它是a。
例如,让我们计算函数f(x) = (x-3)/(x-1)在x趋于1时的极限。
limit((x - 3)/(x-1),1)
MATLAB将执行上述语句并返回以下结果:
ans = NaN
让我们再举一个例子,
limit(x^2 + 5, 3)
MATLAB将执行上述语句并返回以下结果:
ans = 14
使用Octave计算极限
以下是使用**symbolic**包的上述示例的Octave版本,尝试执行并比较结果 -
pkg load symbolic symbols x = sym("x"); subs((x^3+5)/(x^4+7),x,0)
Octave将执行上述语句并返回以下结果 -
ans = 0.7142857142857142857
验证极限的基本性质
代数极限定理提供了一些极限的基本性质。它们如下 -
让我们考虑两个函数 -
- f(x) = (3x + 5)/(x - 3)
- g(x) = x2 + 1。
让我们计算这两个函数在x趋于5时的极限,并使用这两个函数和MATLAB验证极限的基本性质。
示例
创建一个脚本文件,并将以下代码输入其中−
syms x f = (3*x + 5)/(x-3); g = x^2 + 1; l1 = limit(f, 4) l2 = limit (g, 4) lAdd = limit(f + g, 4) lSub = limit(f - g, 4) lMult = limit(f*g, 4) lDiv = limit (f/g, 4)
运行文件时,它会显示−
l1 = 17 l2 = 17 lAdd = 34 lSub = 0 lMult = 289 lDiv = 1
使用Octave验证极限的基本性质
以下是使用**symbolic**包的上述示例的Octave版本,尝试执行并比较结果 -
pkg load symbolic symbols x = sym("x"); f = (3*x + 5)/(x-3); g = x^2 + 1; l1 = subs(f, x, 4) l2 = subs (g, x, 4) lAdd = subs (f+g, x, 4) lSub = subs (f-g, x, 4) lMult = subs (f*g, x, 4) lDiv = subs (f/g, x, 4)
Octave将执行上述语句并返回以下结果 -
l1 = 17.0 l2 = 17.0 lAdd = 34.0 lSub = 0.0 lMult = 289.0 lDiv = 1.0
左侧和右侧极限
当函数在变量的某个特定值处存在间断时,该点的极限不存在。换句话说,当x从左侧逼近a时的极限值不等于x从右侧逼近a时的极限值时,函数f(x)在x = a处存在间断。
这导致了左侧极限和右侧极限的概念。左侧极限定义为x从左侧趋于a时的极限,即x逼近a,且x < a。右侧极限定义为x从右侧趋于a时的极限,即x逼近a,且x > a。当左侧极限和右侧极限不相等时,极限不存在。
让我们考虑一个函数 -
f(x) = (x - 3)/|x - 3|
我们将证明limx->3 f(x)不存在。MATLAB通过两种方式帮助我们证实这一点 -
- 通过绘制函数的图形并显示间断点。
- 通过计算极限并显示两者不同。
左侧和右侧极限是通过将字符字符串'left'和'right'作为最后一个参数传递给limit命令来计算的。
示例
创建一个脚本文件,并将以下代码输入其中−
f = (x - 3)/abs(x-3); ezplot(f,[-1,5]) l = limit(f,x,3,'left') r = limit(f,x,3,'right')
当你运行文件时,MATLAB将绘制以下图形
之后将显示以下输出 -
l = -1 r = 1
MATLAB - 微分
MATLAB提供了**diff**命令用于计算符号导数。在其最简单的形式中,你将要微分的函数作为参数传递给diff命令。
例如,让我们计算函数f(t) = 3t2 + 2t-2的导数。
示例
创建一个脚本文件,并将以下代码输入其中−
syms t f = 3*t^2 + 2*t^(-2); diff(f)
编译并执行上述代码后,会产生以下结果:
ans = 6*t - 4/t^3
以下是上述计算的Octave等价物 -
pkg load symbolic symbols t = sym("t"); f = 3*t^2 + 2*t^(-2); differentiate(f,t)
Octave执行代码并返回以下结果 -
ans = -(4.0)*t^(-3.0)+(6.0)*t
验证微分的基本规则
让我们简要说明函数微分的各种方程或规则,并验证这些规则。为此,我们将使用f'(x)表示一阶导数,f"(x)表示二阶导数。
以下是微分的规则 -
规则1
对于任何函数f和g以及任何实数a和b,函数 -
**h(x) = af(x) + bg(x)**关于x的导数由 -
h'(x) = af'(x) + bg'(x)
规则2
**加法**和**减法**规则指出,如果f和g是两个函数,f'和g'分别是它们的导数,则,
(f + g)' = f' + g'
(f - g)' = f' - g'
规则3
**乘积**规则指出,如果f和g是两个函数,f'和g'分别是它们的导数,则,
(f.g)' = f'.g + g'.f
规则4
**商**规则指出,如果f和g是两个函数,f'和g'分别是它们的导数,则,
(f/g)' = (f'.g - g'.f)/g2
规则5
**多项式**或基本幂规则指出,如果y = f(x) = xn,则f' = n. x(n-1)
该规则的一个直接结果是任何常数的导数为零,即如果y = k,任何常数,则
f' = 0
规则6
链式法则指出,函数的函数h(x) = f(g(x))关于x的导数为:
h'(x)= f'(g(x)).g'(x)
示例
创建一个脚本文件,并将以下代码输入其中−
syms x syms t f = (x + 2)*(x^2 + 3) der1 = diff(f) f = (t^2 + 3)*(sqrt(t) + t^3) der2 = diff(f) f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2) der3 = diff(f) f = (2*x^2 + 3*x)/(x^3 + 1) der4 = diff(f) f = (x^2 + 1)^17 der5 = diff(f) f = (t^3 + 3* t^2 + 5*t -9)^(-6) der6 = diff(f)
运行文件后,MATLAB 显示以下结果:
f = (x^2 + 3)*(x + 2) der1 = 2*x*(x + 2) + x^2 + 3 f = (t^(1/2) + t^3)*(t^2 + 3) der2 = (t^2 + 3)*(3*t^2 + 1/(2*t^(1/2))) + 2*t*(t^(1/2) + t^3) f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2) der3 = (2*x - 2)*(3*x^3 - 5*x^2 + 2) - (- 9*x^2 + 10*x)*(x^2 - 2*x + 1) f = (2*x^2 + 3*x)/(x^3 + 1) der4 = (4*x + 3)/(x^3 + 1) - (3*x^2*(2*x^2 + 3*x))/(x^3 + 1)^2 f = (x^2 + 1)^17 der5 = 34*x*(x^2 + 1)^16 f = 1/(t^3 + 3*t^2 + 5*t - 9)^6 der6 = -(6*(3*t^2 + 6*t + 5))/(t^3 + 3*t^2 + 5*t - 9)^7
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); t = sym("t"); f = (x + 2)*(x^2 + 3) der1 = differentiate(f,x) f = (t^2 + 3)*(t^(1/2) + t^3) der2 = differentiate(f,t) f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2) der3 = differentiate(f,x) f = (2*x^2 + 3*x)/(x^3 + 1) der4 = differentiate(f,x) f = (x^2 + 1)^17 der5 = differentiate(f,x) f = (t^3 + 3* t^2 + 5*t -9)^(-6) der6 = differentiate(f,t)
Octave执行代码并返回以下结果 -
f = (2.0+x)*(3.0+x^(2.0)) der1 = 3.0+x^(2.0)+(2.0)*(2.0+x)*x f = (t^(3.0)+sqrt(t))*(3.0+t^(2.0)) der2 = (2.0)*(t^(3.0)+sqrt(t))*t+((3.0)*t^(2.0)+(0.5)*t^(-0.5))*(3.0+t^(2.0)) f = (1.0+x^(2.0)-(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0)) der3 = (-2.0+(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))+((9.0)*x^(2.0)-(10.0)*x)*(1.0+x^(2.0)-(2.0)*x) f = (1.0+x^(3.0))^(-1)*((2.0)*x^(2.0)+(3.0)*x) der4 = (1.0+x^(3.0))^(-1)*(3.0+(4.0)*x)-(3.0)*(1.0+x^(3.0))^(-2)*x^(2.0)*((2.0)*x^(2.0)+(3.0)*x) f = (1.0+x^(2.0))^(17.0) der5 = (34.0)*(1.0+x^(2.0))^(16.0)*x f = (-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-6.0) der6 = -(6.0)*(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-7.0)*(5.0+(3.0)*t^(2.0)+(6.0)*t)
指数函数、对数函数和三角函数的导数
下表提供了常用指数函数、对数函数和三角函数的导数:
函数 | 导数 |
---|---|
ca.x | ca.x.ln c.a(ln 为自然对数) |
ex | ex |
ln x | 1/x |
lncx | 1/x.ln c |
xx | xx.(1 + ln x) |
sin(x) | cos(x) |
cos(x) | -sin(x) |
tan(x) | sec2(x),或 1/cos2(x),或 1 + tan2(x) |
cot(x) | -csc2(x),或 -1/sin2(x),或 -(1 + cot2(x)) |
sec(x) | sec(x).tan(x) |
csc(x) | -csc(x).cot(x) |
示例
创建一个脚本文件,并将以下代码输入其中−
syms x y = exp(x) diff(y) y = x^9 diff(y) y = sin(x) diff(y) y = tan(x) diff(y) y = cos(x) diff(y) y = log(x) diff(y) y = log10(x) diff(y) y = sin(x)^2 diff(y) y = cos(3*x^2 + 2*x + 1) diff(y) y = exp(x)/sin(x) diff(y)
运行文件后,MATLAB 显示以下结果:
y = exp(x) ans = exp(x) y = x^9 ans = 9*x^8 y = sin(x) ans = cos(x) y = tan(x) ans = tan(x)^2 + 1 y = cos(x) ans = -sin(x) y = log(x) ans = 1/x y = log(x)/log(10) ans = 1/(x*log(10)) y = sin(x)^2 ans = 2*cos(x)*sin(x) y = cos(3*x^2 + 2*x + 1) ans = -sin(3*x^2 + 2*x + 1)*(6*x + 2) y = exp(x)/sin(x) ans = exp(x)/sin(x) - (exp(x)*cos(x))/sin(x)^2
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); y = Exp(x) differentiate(y,x) y = x^9 differentiate(y,x) y = Sin(x) differentiate(y,x) y = Tan(x) differentiate(y,x) y = Cos(x) differentiate(y,x) y = Log(x) differentiate(y,x) % symbolic packages does not have this support %y = Log10(x) %differentiate(y,x) y = Sin(x)^2 differentiate(y,x) y = Cos(3*x^2 + 2*x + 1) differentiate(y,x) y = Exp(x)/Sin(x) differentiate(y,x)
Octave执行代码并返回以下结果 -
y = exp(x) ans = exp(x) y = x^(9.0) ans = (9.0)*x^(8.0) y = sin(x) ans = cos(x) y = tan(x) ans = 1+tan(x)^2 y = cos(x) ans = -sin(x) y = log(x) ans = x^(-1) y = sin(x)^(2.0) ans = (2.0)*sin(x)*cos(x) y = cos(1.0+(2.0)*x+(3.0)*x^(2.0)) ans = -(2.0+(6.0)*x)*sin(1.0+(2.0)*x+(3.0)*x^(2.0)) y = sin(x)^(-1)*exp(x) ans = sin(x)^(-1)*exp(x)-sin(x)^(-2)*cos(x)*exp(x)
计算高阶导数
要计算函数 f 的高阶导数,我们使用语法diff(f,n)。
让我们计算函数 y = f(x) = x .e-3x 的二阶导数。
f = x*exp(-3*x); diff(f, 2)
MATLAB 执行代码并返回以下结果:
ans = 9*x*exp(-3*x) - 6*exp(-3*x)
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); f = x*Exp(-3*x); differentiate(f, x, 2)
Octave执行代码并返回以下结果 -
ans = (9.0)*exp(-(3.0)*x)*x-(6.0)*exp(-(3.0)*x)
示例
在这个例子中,让我们解决一个问题。给定一个函数y = f(x) = 3 sin(x) + 7 cos(5x)。我们需要找出方程f" + f = -5cos(2x)是否成立。
创建一个脚本文件,并将以下代码输入其中−
syms x y = 3*sin(x)+7*cos(5*x); % defining the function lhs = diff(y,2)+y; %evaluting the lhs of the equation rhs = -5*cos(2*x); %rhs of the equation if(isequal(lhs,rhs)) disp('Yes, the equation holds true'); else disp('No, the equation does not hold true'); end disp('Value of LHS is: '), disp(lhs);
运行文件时,它会显示以下结果−
No, the equation does not hold true Value of LHS is: -168*cos(5*x)
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); y = 3*Sin(x)+7*Cos(5*x); % defining the function lhs = differentiate(y, x, 2) + y; %evaluting the lhs of the equation rhs = -5*Cos(2*x); %rhs of the equation if(lhs == rhs) disp('Yes, the equation holds true'); else disp('No, the equation does not hold true'); end disp('Value of LHS is: '), disp(lhs);
Octave执行代码并返回以下结果 -
No, the equation does not hold true Value of LHS is: -(168.0)*cos((5.0)*x)
寻找曲线的极大值和极小值
如果我们正在寻找图形的局部极大值和极小值,我们基本上是在寻找函数图形在特定局部或特定符号变量值范围内最高或最低的点。
对于函数 y = f(x),图形上斜率为零的点称为驻点。换句话说,驻点是 f'(x) = 0 的点。
为了找到函数的驻点,我们需要求导,并将导数设为零并求解方程。
示例
让我们找到函数 f(x) = 2x3 + 3x2 − 12x + 17 的驻点。
采取以下步骤:
首先,让我们输入函数并绘制其图形。
syms x y = 2*x^3 + 3*x^2 - 12*x + 17; % defining the function ezplot(y)
MATLAB 执行代码并返回以下图形:
以下是上述示例的 Octave 等效代码:
pkg load symbolic symbols x = sym('x'); y = inline("2*x^3 + 3*x^2 - 12*x + 17"); ezplot(y) print -deps graph.eps
我们的目标是在图形上找到一些局部极大值和极小值,因此让我们在图形的区间 [-2, 2] 上找到局部极大值和极小值。
syms x y = 2*x^3 + 3*x^2 - 12*x + 17; % defining the function ezplot(y, [-2, 2])
MATLAB 执行代码并返回以下图形:
以下是上述示例的 Octave 等效代码:
pkg load symbolic symbols x = sym('x'); y = inline("2*x^3 + 3*x^2 - 12*x + 17"); ezplot(y, [-2, 2]) print -deps graph.eps
接下来,让我们计算导数。
g = diff(y)
MATLAB 执行代码并返回以下结果:
g = 6*x^2 + 6*x - 12
以下是上述计算的 Octave 等效代码:
pkg load symbolic symbols x = sym("x"); y = 2*x^3 + 3*x^2 - 12*x + 17; g = differentiate(y,x)
Octave执行代码并返回以下结果 -
g = -12.0+(6.0)*x+(6.0)*x^(2.0)
让我们求解导数函数 g,以获得其变为零的值。
s = solve(g)
MATLAB 执行代码并返回以下结果:
s = 1 -2
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); y = 2*x^3 + 3*x^2 - 12*x + 17; g = differentiate(y,x) roots([6, 6, -12])
Octave执行代码并返回以下结果 -
g = -12.0+(6.0)*x^(2.0)+(6.0)*x ans = -2 1
这与我们的图形一致。因此,让我们在临界点 x = 1, -2 处计算函数 f 的值。 我们可以使用subs命令在符号函数中替换一个值。
subs(y, 1), subs(y, -2)
MATLAB 执行代码并返回以下结果:
ans = 10 ans = 37
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); y = 2*x^3 + 3*x^2 - 12*x + 17; g = differentiate(y,x) roots([6, 6, -12]) subs(y, x, 1), subs(y, x, -2)
ans = 10.0 ans = 37.0-4.6734207789940138748E-18*I
因此,函数 f(x) = 2x3 + 3x2 − 12x + 17 在区间 [-2,2] 上的最小值和最大值分别为 10 和 37。
求解微分方程
MATLAB 提供了dsolve命令来符号求解微分方程。
dsolve命令用于求解单个方程的最基本形式是
dsolve('eqn')
其中eqn是用于输入方程的文本字符串。
它返回一个符号解,其中包含一组 MATLAB 标记为 C1、C2 等的任意常数。
您还可以为问题指定初始条件和边界条件,作为方程后面的逗号分隔列表,如下所示:
dsolve('eqn','cond1', 'cond2',…)
为了使用 dsolve 命令,导数用 D 表示。例如,方程 f'(t) = -2*f + cost(t) 输入为:
'Df = -2*f + cos(t)'
高阶导数用 D 后跟导数的阶数表示。
例如,方程 f"(x) + 2f'(x) = 5sin3x 应输入为:
'D2y + 2Dy = 5*sin(3*x)'
让我们举一个一阶微分方程的简单例子:y' = 5y。
s = dsolve('Dy = 5*y')
MATLAB 执行代码并返回以下结果:
s = C2*exp(5*t)
让我们再举一个二阶微分方程的例子:y" - y = 0,y(0) = -1,y'(0) = 2。
dsolve('D2y - y = 0','y(0) = -1','Dy(0) = 2')
MATLAB 执行代码并返回以下结果:
ans = exp(t)/2 - (3*exp(-t))/2
MATLAB - 积分
积分处理两种本质上不同的问题类型。
在第一种类型中,给定函数的导数,我们想要找到该函数。因此,我们基本上是反转微分过程。这个反向过程称为反微分、求原函数或求不定积分。
第二类问题涉及将非常多的非常小的量加起来,然后取这些量的大小接近零时的极限,而项数趋于无穷大。这个过程导致了定积分的定义。
定积分用于求面积、体积、重心、惯性矩、力做的功以及许多其他应用。
使用 MATLAB 求不定积分
根据定义,如果函数 f(x) 的导数是 f'(x),那么我们说 f'(x) 关于 x 的不定积分是 f(x)。例如,由于 x2 关于 x 的导数是 2x,所以我们可以说 2x 的不定积分是 x2。
用符号表示:
f'(x2) = 2x,因此,
∫ 2xdx = x2。
不定积分不是唯一的,因为对于任意常数 c 的值,x2 + c 的导数也将是 2x。
用符号表示为:
∫ 2xdx = x2 + c.
其中,c 称为“任意常数”。
MATLAB 提供了一个int命令来计算表达式的积分。要推导出函数不定积分的表达式,我们写:
int(f);
例如,从我们之前的例子:
syms x int(2*x)
MATLAB 执行上述语句并返回以下结果:
ans = x^2
示例 1
在这个例子中,让我们找到一些常用表达式的积分。创建一个脚本文件,并在其中键入以下代码:
syms x n int(sym(x^n)) f = 'sin(n*t)' int(sym(f)) syms a t int(a*cos(pi*t)) int(a^x)
运行文件时,它会显示以下结果−
ans = piecewise([n == -1, log(x)], [n ~= -1, x^(n + 1)/(n + 1)]) f = sin(n*t) ans = -cos(n*t)/n ans = (a*sin(pi*t))/pi ans = a^x/log(a)
示例 2
创建一个脚本文件,并在其中键入以下代码−
syms x n int(cos(x)) int(exp(x)) int(log(x)) int(x^-1) int(x^5*cos(5*x)) pretty(int(x^5*cos(5*x))) int(x^-5) int(sec(x)^2) pretty(int(1 - 10*x + 9 * x^2)) int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2) pretty(int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2))
请注意,pretty函数以更易读的格式返回表达式。
运行文件时,它会显示以下结果−
ans = sin(x) ans = exp(x) ans = x*(log(x) - 1) ans = log(x) ans = (24*cos(5*x))/3125 + (24*x*sin(5*x))/625 - (12*x^2*cos(5*x))/125 + (x^4*cos(5*x))/5 - (4*x^3*sin(5*x))/25 + (x^5*sin(5*x))/5 2 4 24 cos(5 x) 24 x sin(5 x) 12 x cos(5 x) x cos(5 x) ----------- + ------------- - -------------- + ------------ 3125 625 125 5 3 5 4 x sin(5 x) x sin(5 x) ------------- + ----------- 25 5 ans = -1/(4*x^4) ans = tan(x) 2 x (3 x - 5 x + 1) ans = - (7*x^6)/12 - (3*x^5)/5 + (5*x^4)/8 + x^3/2 6 5 4 3 7 x 3 x 5 x x - ---- - ---- + ---- + -- 12 5 8 2
使用 MATLAB 求定积分
根据定义,定积分基本上是和的极限。我们使用定积分来求面积,例如曲线与 x 轴之间的面积以及两条曲线之间的面积。定积分也可以用于其他情况,其中所需的数量可以表示为和的极限。
int函数可以通过传递要计算积分的极限来用于定积分。
计算
我们写:
int(x, a, b)
例如,要计算的值,我们写:
int(x, 4, 9)
MATLAB 执行上述语句并返回以下结果:
ans = 65/2
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); f = x; c = [1, 0]; integral = polyint(c); a = polyval(integral, 9) - polyval(integral, 4); display('Area: '), disp(double(a));
Octave执行代码并返回以下结果 -
Area: 32.500
可以使用 Octave 提供的 quad() 函数给出另一种解决方案,如下所示:
pkg load symbolic symbols f = inline("x"); [a, ierror, nfneval] = quad(f, 4, 9); display('Area: '), disp(double(a));
Octave执行代码并返回以下结果 -
Area: 32.500
示例 1
让我们计算 x 轴、曲线 y = x3−2x+5 和纵坐标 x = 1 和 x = 2 所包围的面积。
所需面积由下式给出:
创建一个脚本文件,并键入以下代码−
f = x^3 - 2*x +5; a = int(f, 1, 2) display('Area: '), disp(double(a));
运行文件时,它会显示以下结果−
a = 23/4 Area: 5.7500
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); f = x^3 - 2*x +5; c = [1, 0, -2, 5]; integral = polyint(c); a = polyval(integral, 2) - polyval(integral, 1); display('Area: '), disp(double(a));
Octave执行代码并返回以下结果 -
Area: 5.7500
可以使用 Octave 提供的 quad() 函数给出另一种解决方案,如下所示:
pkg load symbolic symbols x = sym("x"); f = inline("x^3 - 2*x +5"); [a, ierror, nfneval] = quad(f, 1, 2); display('Area: '), disp(double(a));
Octave执行代码并返回以下结果 -
Area: 5.7500
示例 2
求曲线 f(x) = x2 cos(x) 在 −4 ≤ x ≤ 9 范围内的面积。
创建一个脚本文件,并编写以下代码:
f = x^2*cos(x); ezplot(f, [-4,9]) a = int(f, -4, 9) disp('Area: '), disp(double(a));
运行文件后,MATLAB 会绘制图形:
输出如下:
a = 8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9) Area: 0.3326
以下是上述计算的Octave等价物 -
pkg load symbolic symbols x = sym("x"); f = inline("x^2*cos(x)"); ezplot(f, [-4,9]) print -deps graph.eps [a, ierror, nfneval] = quad(f, -4, 9); display('Area: '), disp(double(a));
MATLAB - 多项式
MATLAB 将多项式表示为包含按降幂排序的系数的行向量。例如,方程 P(x) = x4 + 7x3 - 5x + 9 可以表示为:
p = [1 7 0 -5 9];
评估多项式
polyval函数用于在指定值处评估多项式。例如,要评估我们之前在 x = 4 处的多项式p,键入:
p = [1 7 0 -5 9]; polyval(p,4)
MATLAB 执行上述语句并返回以下结果:
ans = 693
MATLAB 还提供了polyvalm函数来评估矩阵多项式。矩阵多项式是多项式,其变量为矩阵。
例如,让我们创建一个方阵 X 并评估多项式 p 在 X 处的值:
p = [1 7 0 -5 9]; X = [1 2 -3 4; 2 -5 6 3; 3 1 0 2; 5 -7 3 8]; polyvalm(p, X)
MATLAB 执行上述语句并返回以下结果:
ans = 2307 -1769 -939 4499 2314 -2376 -249 4695 2256 -1892 -549 4310 4570 -4532 -1062 9269
查找多项式的根
roots函数计算多项式的根。例如,要计算我们多项式 p 的根,键入:
p = [1 7 0 -5 9]; r = roots(p)
MATLAB 执行上述语句并返回以下结果:
r = -6.8661 + 0.0000i -1.4247 + 0.0000i 0.6454 + 0.7095i 0.6454 - 0.7095i
poly函数是 roots 函数的反函数,并返回到多项式系数。例如:
p2 = poly(r)
MATLAB 执行上述语句并返回以下结果:
p2 = Columns 1 through 3: 1.00000 + 0.00000i 7.00000 + 0.00000i 0.00000 + 0.00000i Columns 4 and 5: -5.00000 - 0.00000i 9.00000 + 0.00000i
多项式曲线拟合
polyfit函数找到以最小二乘意义拟合一组数据的多项式的系数。如果 x 和 y 是两个包含要拟合到 n 次多项式的 x 和 y 数据的向量,那么我们可以通过编写以下代码获得拟合数据的多项式:
p = polyfit(x,y,n)
示例
创建一个脚本文件,并键入以下代码−
x = [1 2 3 4 5 6]; y = [5.5 43.1 128 290.7 498.4 978.67]; %data p = polyfit(x,y,4) %get the polynomial % Compute the values of the polyfit estimate over a finer range, % and plot the estimate over the real data values for comparison: x2 = 1:.1:6; y2 = polyval(p,x2); plot(x,y,'o',x2,y2) grid on
运行文件后,MATLAB 显示以下结果:
p = 4.1056 -47.9607 222.2598 -362.7453 191.1250
并绘制以下图形:
MATLAB - 变换
MATLAB 提供了用于处理变换的命令,例如拉普拉斯变换和傅里叶变换。变换在科学和工程中用作简化分析和从另一个角度查看数据的工具。
例如,傅里叶变换允许我们将表示为时间函数的信号转换为频率函数。拉普拉斯变换允许我们将微分方程转换为代数方程。
MATLAB 提供了laplace、fourier和fft命令来处理拉普拉斯变换、傅里叶变换和快速傅里叶变换。
拉普拉斯变换
时间函数 f(t) 的拉普拉斯变换由以下积分给出:
拉普拉斯变换也表示为 f(t) 到 F(s) 的变换。您可以看到此变换或积分过程将 f(t)(符号变量 t 的函数)转换为另一个函数 F(s),其变量为 s。
拉普拉斯变换将微分方程转换为代数方程。要计算函数 f(t) 的拉普拉斯变换,请编写:
laplace(f(t))
示例
在这个例子中,我们将计算一些常用函数的拉普拉斯变换。
创建一个脚本文件,并键入以下代码−
syms s t a b w laplace(a) laplace(t^2) laplace(t^9) laplace(exp(-b*t)) laplace(sin(w*t)) laplace(cos(w*t))
运行文件时,它会显示以下结果−
ans = 1/s^2 ans = 2/s^3 ans = 362880/s^10 ans = 1/(b + s) ans = w/(s^2 + w^2) ans = s/(s^2 + w^2)
拉普拉斯逆变换
MATLAB 允许我们使用ilaplace命令计算拉普拉斯逆变换。
例如:
ilaplace(1/s^3)
MATLAB 将执行上述语句并显示结果:
ans = t^2/2
示例
创建一个脚本文件,并键入以下代码−
syms s t a b w ilaplace(1/s^7) ilaplace(2/(w+s)) ilaplace(s/(s^2+4)) ilaplace(exp(-b*t)) ilaplace(w/(s^2 + w^2)) ilaplace(s/(s^2 + w^2))
运行文件时,它会显示以下结果−
ans = t^6/720 ans = 2*exp(-t*w) ans = cos(2*t) ans = ilaplace(exp(-b*t), t, x) ans = sin(t*w) ans = cos(t*w)
傅里叶变换
傅里叶变换通常将时间数学函数 f(t) 转换为一个新函数,有时表示为或 F,其参数为频率,单位为周期/秒(赫兹)或弧度/秒。然后将新函数称为傅里叶变换和/或函数 f 的频谱。
示例
创建一个脚本文件,并在其中键入以下代码−
syms x f = exp(-2*x^2); %our function ezplot(f,[-2,2]) % plot of our function FT = fourier(f) % Fourier transform
运行文件后,MATLAB 会绘制以下图形:
显示以下结果:
FT = (2^(1/2)*pi^(1/2)*exp(-w^2/8))/2
绘制傅里叶变换为:
ezplot(FT)
给出以下图形:
傅里叶逆变换
MATLAB 提供了ifourier命令来计算函数的傅里叶逆变换。例如,
f = ifourier(-2*exp(-abs(w)))
MATLAB 将执行上述语句并显示结果:
f = -2/(pi*(x^2 + 1))
MATLAB - GNU Octave 教程
GNU Octave 是一种类似于 MATLAB 的高级编程语言,并且与 MATLAB 大部分兼容。它也用于数值计算。
Octave 与 MATLAB 具有以下共同特征:
- 矩阵是基本数据类型
- 它内置支持复数
- 它具有内置的数学函数和库
- 它支持用户定义的函数
GNU Octave 也是免费可再分发的软件。您可以根据自由软件基金会发布的 GNU 通用公共许可证 (GPL) 的条款重新分发和/或修改它。
MATLAB 与 Octave 的比较
大多数 MATLAB 程序都可以在 Octave 中运行,但一些 Octave 程序可能无法在 MATLAB 中运行,因为 Octave 允许某些 MATLAB 不支持的语法。
例如,MATLAB 仅支持单引号,但 Octave 支持单引号和双引号来定义字符串。如果您正在寻找 Octave 的教程,那么请从头到尾阅读本教程,它涵盖了 MATLAB 和 Octave。
兼容示例
本教程中涵盖的几乎所有示例都兼容 MATLAB 和 Octave。让我们在 MATLAB 和 Octave 中尝试以下示例,该示例在没有任何语法更改的情况下产生相同的结果。
此示例为函数 g = xe-(x2 + y2) 创建一个 3D 表面图。创建一个脚本文件并键入以下代码:
[x,y] = meshgrid(-2:.2:2); g = x .* exp(-x.^2 - y.^2); surf(x, y, g) print -deps graph.eps
当你运行文件时,MATLAB将显示以下3D图 -
不兼容的示例
尽管 Octave 中提供了 MATLAB 的所有核心功能,但也有一些功能(例如,微积分和积分),在两种语言中的匹配并不完全相同。本教程尝试提供两种类型的示例,其中它们的语法有所不同。
考虑以下示例,其中 MATLAB 和 Octave 使用不同的函数来获取曲线的面积:f(x) = x2 cos(x),其中 -4 ≤ x ≤ 9。以下是 MATLAB 版本的代码:
f = x^2*cos(x); ezplot(f, [-4,9]) a = int(f, -4, 9) disp('Area: '), disp(double(a));
运行文件后,MATLAB 会绘制图形:
显示以下结果
a = 8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9) Area: 0.3326
但是,要在 Octave 中获得相同曲线的面积,您必须使用 **symbolic** 包,如下所示:
pkg load symbolic symbols x = sym("x"); f = inline("x^2*cos(x)"); ezplot(f, [-4,9]) print -deps graph.eps [a, ierror, nfneval] = quad(f, -4, 9); display('Area: '), disp(double(a));
MATLAB - Simulink
Simulink 是一个用于动态和嵌入式系统的仿真和基于模型的设计环境,与 MATLAB 集成在一起。Simulink 也是由 MathWorks 开发的,是一种用于建模、仿真和分析多领域动态系统的数据流图形编程语言工具。它基本上是一个图形化块图工具,具有可自定义的块库集。
它允许您将 MATLAB 算法集成到模型中,并将仿真结果导出到 MATLAB 以进行进一步分析。
Simulink 支持:
- 系统级设计
- 仿真
- 自动代码生成
- 嵌入式系统的测试和验证
MathWorks 提供了许多其他附加产品,以及可与 Simulink 一起使用的第三方硬件和软件产品。
以下列表简要介绍了其中一些:
**Stateflow** 允许开发状态机和流程图。
**Simulink Coder** 允许自动生成 C 源代码,以便实时实现系统。
**xPC Target** 以及 **基于 x86 的实时系统** 提供了一个环境,可以在物理系统上实时仿真和测试 Simulink 和 Stateflow 模型。
**Embedded Coder** 支持特定的嵌入式目标。
**HDL Coder** 允许自动生成可综合的 VHDL 和 Verilog。
**SimEvents** 提供了一个图形化构建块库,用于建模排队系统。
Simulink 能够通过建模风格检查、需求跟踪和模型覆盖率分析来系统地验证和确认模型。
Simulink Design Verifier 允许您识别设计错误并为模型检查生成测试用例场景。
使用 Simulink
要打开 Simulink,请在 MATLAB 工作空间中键入:
simulink
Simulink 将打开 **库浏览器**。库浏览器用于构建仿真模型。
在左侧窗口窗格中,您会发现几个根据各种系统分类的库,单击每个库将在右侧窗口窗格中显示设计块。
构建模型
要创建新模型,请单击库浏览器工具栏上的 **新建** 按钮。这将打开一个新的无标题模型窗口。
Simulink 模型是一个块图。
模型元素是通过从库浏览器中选择相应的元素并将其拖放到模型窗口中来添加的。
或者,您可以复制模型元素并将其粘贴到模型窗口中。
示例
从 Simulink 库中拖放项目以创建您的项目。
出于本示例的目的,将使用两个块进行仿真 - **源**(信号)和 **汇点**(示波器)。信号发生器(源)生成模拟信号,然后示波器(汇点)将以图形方式显示该信号。
首先将所需的块从库拖到项目窗口。然后,将块连接在一起,这可以通过将连接器从一个块上的连接点拖到另一个块上的连接点来完成。
让我们将一个“正弦波”块拖到模型中。
从库中选择“汇点”,并将“示波器”块拖到模型中。
将信号线从正弦波块的输出拖到示波器块的输入。
通过按下“**运行**”按钮运行仿真,保持所有参数为默认值(您可以从“仿真”菜单中更改它们)
您应该从示波器中获得以下图形。