编辑器窗口 | |
---|---|
自动整理代码 | 用鼠标选中代码行,按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/PageDownCtrl+PgUp表示编辑器窗口向左切换文件Ctrl+PgDn表示编辑器窗口向右切换文件 |
代码调试常用快捷键: | |
运行 | F5可保存并直接运行程序 |
执行选中代码段 | F9 |
单步执行 | F10 |
F11 | 表示step in,即当遇见子函数时,使用此快捷键,进入函数内部 |
Shift + F11 | 表示step out,即使用此快捷键,执行完子函数的剩余程序,并跳出子函数 |
设置或取消断点的方法有两种 | (1) 在要设置断点的行左侧的-处单击;(2) 可按F12设置断点。 |
直接跳至某行 | Ctrl + G, 当程序源代码很长时,可能有几百上千行。有时错误出现在很后面的地方,需要用鼠标中间的滚轮往下滚很久,才能滚到想要的那一行。这时,按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) |
[]
矩阵
定义
x = [];
{}
集合
定义
x = {};
struct()
结构体
定义
x = struct();
”
字符数组
定义
x = ‘aaa’;
“”
字符串
定义
x = “aaa”;
注意:''
和 ""
是不同的。
clear 变量名 :清楚变量
who 、whos : 可以查看当前我们有的所有变量。区别:,who这个命令仅仅是列出变量的名字,而whos这个命令,显示的信息更加的全面,包括数据的大小(由于matlab默认用二维数组存放,所以对于数字,就是一行一列的数组,就是单个的值),类型,占了多少空间等数据。
MATLAB常用的运算符和特殊字符如下表所示:
运算符 | 目的 |
---|---|
+ | 加;加法运算符 |
- | 减;减法运算符 |
***** | 标量和矩阵乘法运算符 |
.* | 数组乘法运算符 |
^ | 标量和矩阵求幂运算符 |
.^ | 数组求幂运算符 |
\ | 矩阵左除 |
/ | 矩阵右除 |
.\ | 阵列左除 |
./ | 阵列右除 |
: | 向量生成;子阵提取 |
( ) | 下标运算;参数定义 |
[ ] | 矩阵生成 |
. | 点乘运算,常与其他运算符联合使用 |
… | 续行标志;行连续运算符 |
, | 分行符(该行结果不显示) |
; | 语句结束;分行符(该行结果显示) |
% | 注释标志 |
_ | 引用符号和转置运算符 |
._ | 非共轭转置运算符 |
= | 赋值运算符 |
MATLAB支持以下特殊变量和常量:
Name | Meaning |
---|---|
ans | 默认的变量名,以应答最近依次操作运算结果 |
eps | 浮点数的相对误差 |
i,j | 虚数单位,定义为 i2 = j2 = -1 |
Inf | 代表无穷大 |
NaN | 代表不定值(不是数字) |
pi | 圆周率 |
变量名称是由一个字母后由任意数量的字母,数字或下划线。
注意MATLAB中是区分大小写的。
变量名可以是任意长度,但是,MATLAB使用只有前N个字符,其中N是由函数namelengthmax。
MATLAB使用save命令保存工作区中的所有变量,然后作为一个扩展名为.mat的文件,在当前目录中。
如以下例子:
save myfile
该文件可以随时重新加载,然后使用load命令。
load myfile
用一个简单的方法指定变量。例如:
x = 3 % defining x and initializing it with a value
MATLAB注意事项:
多个任务可以在同一行。例如,
a = 2; b = 7; c = a * b
在MATLAB中可以使用 who 命令显示所有已经使用的变量名。
who
whos 命令则显示多一点有关变量:
whos
clear命令删除所有(或指定)从内存中的变量(S)。
长任务
长任务可以通过使用省略号(…)延伸到另一条线路。例如,
initial_velocity = 0;
acceleration = 9.8;
time = 20;
final_velocity = initial_velocity ...
+ acceleration * time
默认情况下,MATLAB 四个小数位值显示数字。这就是所谓的 short format.
如果想更精确,需要使用 forma【t 命令。
长(long ) 命令格式显示小数点后16位。
format long
x = 7 + 10/3 + 5 ^ 1.2
空格格式命令回合到小数点后两位数字。例如:
format bank
daily_wage = 177.45;
weekly_wage = daily_wage * 6
MATLAB 显示大量使用指数表示法。
短格式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 =
2063/90
向量是一维数组中的数字。 MATLAB允许创建两种类型的矢量:
创建行向量括在方括号中的元素的集合,用空格或逗号分隔的元素。
r = [7 8 9 10 11]
创建列向量通过内附组方括号中的元素,使用分号(;)分隔的元素。
c = [7; 8; 9; 10; 11]
矩阵是一个二维数字阵列。
在MATLAB中,创建一个矩阵每行输入空格或逗号分隔的元素序列,最后一排被划定一个分号。
例如,下面创建了一个3×3的矩阵:
m = [1 2 3; 4 5 6; 7 8 9]
MATLAB提供管理会话的各种命令。如下表所示:
命令 | 目的/作用 |
---|---|
clc | 清除命令窗口。 |
clear | 从内存中删除变量。 |
exist | 检查存在的文件或变量。 |
global | 声明变量为全局。 |
help | 搜索帮助主题。 |
lookfor | 搜索帮助关键字条目。 |
quit | 停止MATLAB。 |
who | 列出当前变量。 |
whos | 列出当前变量(长显示)。 |
使用MATLAB的时候有一些系统命令可以方便我们的操作,如在当前的工作区中可以使用系统命令保存为一个文件、加载文件、显示日期、列出目录中的文件和显示当前目录等。
下表列举了一些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 的结合,根据数据选择适当的显示方式 |
用于数字显示格式的函数有以下几种形式:
Format函数 | 最多可显示 |
---|---|
format short | 四位十进制数(默认) |
format long | 15位定点表示 |
format short e | 五位浮点表示 |
format long e | 15位浮点表示 |
format bank | 两个十进制数字 |
format + | 正,负或零 |
format rat | 有理数近似 |
format compact | 变量之间没有空行 |
format loose | 变量之间有空行 |
下表列出了MATLAB用于工作数组、矩阵和向量的各种命令:
命令 | 作用/目的 |
---|---|
cat | 连接数组 |
find | 查找非零元素的索引 |
length | 计算元素数量 |
linspace | 创建间隔向量 |
logspace | 创建对数间隔向量 |
max | 返回最大元素 |
min | 返回最小元素 |
prod | 计算数组元素的连乘积 |
reshape | 重新调整矩阵的行数、列数、维数 |
size | 计算数组大小 |
sort | 排序每个列 |
sum | 每列相加 |
eye | 创建一个单位矩阵 |
ones | 生成全1矩阵 |
zeros | 生成零矩阵 |
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 的基本运算类型:
MATLAB 的工作针对的是整个矩阵和阵列,它允许两种不同类型的算术运算:
运算符 | 描述 |
---|---|
+ | 加法或一元加号。A + B将A和B。 A和B必须具有相同的尺寸,除非一个人是一个标量。一个标量,可以被添加到任何大小的矩阵。 |
- | 减法或一元减号。A - B,减去B从A和B必须具有相同的大小,除非是一个标量。可以从任意大小的矩阵中减去一个标量。 |
* | 矩阵乘法;是一个更精确的矩阵A和B的线性代数积,矩阵乘法对于非纯量A和B,列一个数必须等于B.标量可以乘以一个任意大小的矩阵的行数。 |
.* | 数组的乘法;A.*B是数组A和B的元素积,A和B必须具有相同的大小,除非A、B中有一个是标量。 |
/ | 斜线或矩阵右除法;B/A与B * inv(A)大致相同。更确切地说: B/A = (A’B’)’ |
./ | 矩阵右除法;矩阵A与矩阵B相应元素相除(A、B为同纬度的矩阵) |
.\ | 反斜杠或矩阵左除;如果A是一个方阵,AB是大致相同的INV(A)* B,除非它是以不同的方式计算。如果A是一个n*n的矩阵,B是一个n组成的列向量,或是由若干这样的列的矩阵,则X = AB 是方程 AX = B ,如果A严重缩小或者几乎为单数,则显示警告消息。 |
. | 数组左除法;A. B是元素B(i,j)/A(i,j)的矩阵。A和B必须具有相同的大小,除非其中一个是标量。 |
^ | 矩阵的幂。X^P是X到幂P,如果p是标量;如果p是一个整数,则通过重复平方计算功率。如果整数为负数,X首先反转。对P值的计算,涉及到特征值和特征向量,即如果[ D ] = V,EIG(x),那么X^P = V * D.^P / V。 |
.^ | A.^B:A的每个元素的B次幂(A、B为同纬度的矩阵) |
’ | 矩阵的转置;A’是复数矩阵A的线性代数转置,这是复共轭转置。 |
.' | 数组的转置;A’是数组A的转置,对于复数矩阵,这不涉及共轭。 |
除了在上述的逻辑运算符,MATLAB 提供下面的命令或函数用于同样的目的:
函数 | 描述 |
---|---|
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相同的数据类型和稀疏性的逻辑阵列。 |
MATLAB提供各种功能集合运算,如集,交集和测试组成员等。
下表是对一些常用的设置操作的例举与描述:
详细例子
函数 | 描述 |
---|---|
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 | 数组中唯一的值 |
一个 if 语句和一个布尔表达式后跟一个或多个语句,由 end 语句分隔,就是一个 if … end 语句
在MATLAB中建立一个脚本文件,并输入下述代码:
a = 10;
% check the condition using if statement
if a < 20
% if condition is true then print the following
fprintf('a is less than 20
' );
end
fprintf('value of a is : %d
', a);
运行该文件,显示下述结果:
a is less than 20
value of a is : 10
在MATLAB的 if…else…end 语句中,if 语句后面可以跟一个可选择的 else 语句,当执行的表达式为假的时候,执行 else 语句。
在MATLAB中建立一个脚本文件,并输入下述的代码:
a = 100;
% check the boolean condition
if a < 20
% if condition is true then print the following
fprintf('a is less than 20
' );
else
% if condition is false then print the following
fprintf('a is not less than 20
' );
end
fprintf('value of a is : %d
', a);
编译和执行上述代码,产生下述结果:
a is not less than 20
value of a is : 100
MATLAB 的 if…elseif…elseif…else…end 语句中 if 语句可以跟随一个(或多个)可选的 elseif… else 语句,这是非常有用的,可以用来对各种条件进行测试。
使用 if… elseif…elseif…else 语句,要注意以下几点:
在MATLAB中建立一个脚本文件,并输入下述代码:
a = 100;
%check the boolean condition
if a == 10
% if condition is true then print the following
fprintf('Value of a is 10
' );
elseif( a == 20 )
% if else if condition is true
fprintf('Value of a is 20
' );
elseif a == 30
% if else if condition is true
fprintf('Value of a is 30
' );
else
% if none of the conditions is true '
fprintf('None of the values are matching
');
fprintf('Exact value of a is: %d
', a );
end
编译和执行上述代码,产生如下结果:
None of the values are matching
Exact value of a is: 100
在MATLAB中嵌套if语句始终是合法的,也就是说可以使用一个嵌套的 if-else语句 if 或 elseif 语句在另一个 if 或 elseif 语句。
在MATLAB中建立一个脚本文件,并输入下面的代码:
a = 100;
b = 200;
% check the boolean condition
if( a == 100 )
% if condition is true then check the following
if( b == 200 )
% if condition is true then print the following
fprintf('Value of a is 100 and b is 200
' );
end
end
fprintf('Exact value of a is : %d
', a );
fprintf('Exact value of b is : %d
', b );
运行该文件,它显示的结果如下:
Value of a is 100 and b is 200
Exact value of a is : 100
Exact value of b is : 200
MATLAB中 switch 块有条件地执行一组语句,这些语句是从几个选项里选择执行的,其中每个选项涵盖了一个 case 语句。
请记住:
switch 块的功能是测试每个 case ,直到被测试的其中一个 case 是 true 。
case 是 true 的情况如下:
当上述有一个情况是 true,MATLAB 就执行与之相应的语句,然后不再执行以后的语句,直接退出 switch 块。
otherwise 块是可选的,任何情况下,只有当真正执行。
详细例子
在MATLAB中建立一个脚本文件,并输入下述代码:
grade = 'B';
switch(grade)
case 'A'
fprintf('Excellent!
' );
case 'B'
fprintf('Well done
' );
case 'C'
fprintf('Well done
' );
case 'D'
fprintf('You passed
' );
case 'F'
fprintf('Better try again
' );
otherwise
fprintf('Invalid grade
' );
end
运行该文件,显示下述结果:
Well done
Your grade is B
在 MATLAB 中嵌套 switch 语句是可能的,可以在 switch 一部分外嵌套 switch 语句序列。即使 case 常量的内部和外部的 switch 含有共同的值,也不算冲突出现。
在MATLAB中建立一个脚本文件,并输入下面的代码:
a = 100;
b = 200;
switch(a)
case 100
fprintf('This is part of outer switch %d
', a );
switch(b)
case 200
fprintf('This is part of inner switch %d
', a );
end
end
fprintf('Exact value of a is : %d
', a );
fprintf('Exact value of b is : %d
', b );
当运行该文件时,它会显示:
This is part of outer switch 100
This is part of inner switch 100
Exact value of a is : 100
Exact value of b is : 200
MATLAB的 while 循环会重复执行 while 与 end 语句间的运算式,只要表达式为 true。
在MATLAB中建立一个脚本文件,并输入以下代码:
a = 10;
% while loop execution
while( a < 20 )
fprintf('value of a: %d
', a);
a = a + 1;
end
运行该文件,显示结果如下:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
MATLAB中 for 循环是一个重复的控制结构,可以有效地写一个循环,只是执行的次数是特定的。
for 循环的值有下述三种形式之一:
格式 | 描述 |
---|---|
initval:endval | 将索引变量从初始到终值递增1,并重复执行程序语句,直到索引值大于终值。 |
initval:step:endval | 按每次迭代中的值步骤递增索引, 或在步骤为负值时递减。 |
valArray | 在每个迭代 valArrayon 数组的后续列中创建列向量索引。例如, 在第一次迭代中, index = valArray (:, 1),循环执行最大 n 次, 其中 n 是 valArray 的列数,由 numel (valArray, 1,:) 给出。输入 valArray 可以是任何 MATLAB 数据类型, 包括字符串、单元格数组或结构。 |
在MATLAB中建立一个脚本文件,并输入下述代码:
for a = 10:20
fprintf('value of a: %d
', a);
end
运行文件,显示下述结果:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
value of a: 20
在MATLAB中建立一个脚本文件,并输入下述代码:
for a = 1.0: -0.1: 0.0
disp(a)
end
运行该文件,显示以下结果:
1
0.9000
0.8000
0.7000
0.6000
0.5000
0.4000
0.3000
0.2000
0.1000
0
在MATLAB中建立一个脚本文件,并输入下述代码:
for a = [24,18,17,23,28]
disp(a)
end
运行该文件,显示下述结果:
24
18
17
23
28
MATLAB嵌套循环允许使用一个循环的另一循环内。
我们将使用一个嵌套循环来把所有从1到100的素数显示出来。
现在MATLAB中建立一个脚本文件,并输入下述代码:
for i=2:100
for j=2:100
if(~mod(i,j))
break; % if factor found, not prime
end
end
if(j > (i/j))
fprintf('%d is prime
', i);
end
end
然后运行该文件,显示如下结果:
2 is prime
3 is prime
5 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
53 is prime
59 is prime
61 is prime
67 is prime
71 is prime
73 is prime
79 is prime
83 is prime
89 is prime
97 is prime
MATLAB中 break 语句用于终止 for 或 while 循环的执行,当在循环体内执行到该语句的时候,程序将会跳出循环,继续执行循环语句的下一语句。
在MATLAB中建立一个脚本文件,并输入下面的代码:
a = 10;
% while loop execution
while (a < 20 )
fprintf('value of a: %d
', a);
a = a+1;
if( a > 15)
% terminate the loop using break statement
break;
end
end
运行该文件,显示下述结果:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
MATLAB中 continue 语句控制跳过循环体的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所剩下的语句,继续下一次循环。
MATLAB中的 continue 语句跟 break 语句有点像,但 break 是强制终止,continue 强制下一次迭代的循环发生,跳跃中的任何代码之间。
在MATLAB中建立一个脚本文件,并输入下述代码:
a = 10;
%while loop execution
while a < 20
if a == 15
% skip the iteration
a = a + 1;
continue;
end
fprintf('value of a: %d
', a);
a = a + 1;
end
运行该文件,显示下述结果:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19
我们可以创建两种 MATLAB 向量类型:
MATLAB 行向量:
创建行向量括在方括号中的元素的集合,用空格或逗号分隔的元素。
r = [7 8 9 10 11]
执行上述语句,返回下述结果:
r =
Columns 1 through 4
7 8 9 10
Column 5
11
MATLAB 列向量:
创建列向量括在方括号中的元素的集合,使用分号来分隔的元素。
c = [7; 8; 9; 10; 11]
执行上述语句,返回下述结果:
c =
7
8
9
10
11
引用向量元素
可以参照的向量元素的几种方式中的一种或多种。ith 一个矢量v的分量被称为v(i)。
例如:
v = [ 1; 2; 3; 4; 5; 6]; % creating a column vector of 6 elements
v(3)
执行上述语句,返回下述结果:
ans =
3
当引用一个冒号,一个向量,其例如为v(,该载体上的所有组件的被列出。
例如:
v = [ 1; 2; 3; 4; 5; 6]; % creating a column vector of 6 elements
v(:)
执行上述语句,返回下述结果:
ans =
1
2
3
4
5
6
MATLAB允许你选择一个范围从向量的元素。
在下面的例子中,我们创建了一个行向量rv 9个元素,我们将引用元素3至7写rv(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中创建一个脚本文件,代码如下:
A = [7, 11, 15, 23, 9];
B = [2, 5, 13, 16, 20];
C = A + B;
D = A - B;
disp(C);
disp(D);
运行该文件,产生下述结果:
9 16 28 39 29
5 6 2 7 -11
MATLAB标量乘法:让一个数字乘以一个向量。
标量乘法会产生相同类型的新的一个向量,原先的向量的每个元素乘以数量。
MATLAB中建立一个脚本文件,代码如下:
v = [ 12 34 10 8];
m = 5 * v
运行该文件,产生下述结果:
m =
60 170 50 40
MATLAB中转置操作能够将一个行向量改变成一个列向量,反之亦然。
MATLAB中转置操作使用一个单引号(’)来表示。
在MATLAB中建立一个脚本文件,输入下述代码:
r = [ 1 2 3 4 ];
tr = r';
v = [1;2;3;4];
tv = v';
disp(tr); disp(tv);
运行该文件,显示结果如下:
1
2
3
4
1 2 3 4
MATLAB 允许在原有的向量中附加向量,共同创造新的向量。
如果有两个行向量 r1 和 r2 这两个行向量中各有 n 和 m 个元素,现在创建行向量 r 并将n和m个元素都放在行向量 r 中,通过附加这些载体,编写:
r = [r1,r2]
通过追加这两个向量,向量r2的,也可以建立一个矩阵R,矩阵的第二行编写如下:
r = [r1;r2]
要注意的是,要完成上述操作,上述两个载体中的元素的数量应该相同。
当然,可以附加两个列向量 c1 和 c2 的 n 和 m 的元素个数。要创建一个列向量 c 将 n 加 m 个元素放入其中,通过附加这些载体,编写:
c = [c1; c2]
还可以创建一个矩阵c追加这两个向量;向量c2将第二列的矩阵:
c = [c1, c2]
同样要注意,完成上述操作,上述两个载体中的元素的数量应该相同。
详细例子
在MATLAB中建立一个脚本文件,代码如下:
r1 = [ 1 2 3 4 ];
r2 = [5 6 7 8 ];
r = [r1,r2]
rMat = [r1;r2]
c1 = [ 1; 2; 3; 4 ];
c2 = [5; 6; 7; 8 ];
c = [c1; c2]
cMat = [c1,c2]
运行该文件,显示结果如下:
r =
1 2 3 4 5 6 7 8
rMat =
1 2 3 4
5 6 7 8
c =
1
2
3
4
5
6
7
8
cMat =
1 5
2 6
3 7
4 8
向量 v 中的元素 v1, v2, v3, …, vn,下式给出其幅度:
|v| = √(v12 + v22 + v32 + … + vn2)
MATLAB中需要采按照下述步骤进行向量的模的计算:
采取的矢量及自身的积,使用数组相乘(*)。这将产生一个向量sv,其元素是向量的元素的平方和V.
sv = v.*v;
使用求和函数得到 v。这也被称为矢量的点积向量的元素的平方的总和V.
dp= sum(sv);
使用sqrt函数得到的总和的平方根,这也是该矢量的大小V.
mag = sqrt(s);
在MATLAB中建立一个脚本文件,代码如下:
v = [1: 2: 20];
sv = v.* v; %the vector with elements
% as square of v's elements
dp = sum(sv); % sum of squares -- the dot product
mag = sqrt(dp); % magnitude
disp('Magnitude:'); disp(mag);
运行该文件,显示结果如下:
Magnitude:
36.4692
MATLAB 中两个向量的点积 a = (a1, a2, …, an) and b = (b1, b2, …, bn) 由以下给定:
a.b = ∑(ai.bi)
下述函数可以计算两个向量 a 和 b 的点积:
dot(a, b);
在MATLAB中建立一个脚本文件,代码如下:
v1 = [2 3 4];
v2 = [1 2 3];
dp = dot(v1, v2);
disp('Dot Product:'); disp(dp);
运行该文件,显示结果如下:
Dot Product:
20
当一个向量中的元素过多,同时向量的各元素有等差的规律,此时采用直接输入法将过于繁琐。针对该种情况 ,可以使用冒号(:) 来生成等差元素向量。
在MATLAB中建立一个脚本文件,代码如下:
v = [1: 2: 20];
sqv = v.^2;
disp(v);disp(sqv);
运行该文件,显示结果如下:
1 3 5 7 9 11 13 15 17 19
1 9 25 49 81 121 169 225 289 361
在MATLAB中创建矩阵有以下规则:
下面的例子中我们创建了一个4×5的矩阵:
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
如果要引用 mth 行和 nth 列的一个元素,写法如下:
mx(m, n);
例如,参阅第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
当然也可以选择第 n 列的 m 个元素,对于这一点,写法如下:
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
用相同的方式,则可以创建一个子矩阵的一个子部分的矩阵。
例如,让我们创建一个子矩阵内部子部分的:
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 = [ 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 = [ 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
详细例子
在本例中,我们会建立一个3-3的矩阵 m,并把矩阵 m 中的第二行和第三行复制两次,这样就能够建立一个4×3的矩阵。
在MATLAB中建立一个脚本文件,代码如下:
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中建立一个脚本文件,代码如下:
a = [ 1 2 3 ; 4 5 6; 7 8 9];
b = [ 7 5 6 ; 2 0 8; 5 7 1];
c = a + b
d = a - b
运行该文件,显示结果:
c =
8 7 9
6 5 14
12 15 10
d =
-6 -3 -3
2 5 -2
2 1 8
MATLAB 中有两种矩阵除法符号:即左除“\” 和右除 “/” 。
注意:这两个操作数的矩阵必须具有相同的行数和列数。
在MATLAB中建立一个脚本文件,代码如下:
a = [ 1 2 3 ; 4 5 6; 7 8 9];
b = [ 7 5 6 ; 2 0 8; 5 7 1];
c = a / b
d = a b
运行该文件,显示结果:
c =
-0.52542 0.68644 0.66102
-0.42373 0.94068 1.01695
-0.32203 1.19492 1.37288
d =
-3.27778 -1.05556 -4.86111
-0.11111 0.11111 -0.27778
3.05556 1.27778 4.30556
MATLAB矩阵的标量操作就是加,减,乘或者除以一个数字矩阵。
添加到具有原始矩阵的每个元素的行和列,相减,乘或除以数相同数量的标量运算会产生一个新的矩阵。
在MATLAB中建立一个脚本文件,代码如下:
a = [ 10 12 23 ; 14 8 6; 27 8 9];
b = 2;
c = a + b
d = a - b
e = a * b
f = a / b
运行该文件,显示结果:
c =
12 14 25
16 10 8
29 10 11
d =
8 10 21
12 6 4
25 6 7
e =
20 24 46
28 16 12
54 16 18
f =
5.0000 6.0000 11.5000
7.0000 4.0000 3.0000
13.5000 4.0000 4.5000
MATLAB中矩阵的转置操作是用一个单引号(’)表示的,该操作能够切换一个矩阵的行和列。
在MATLAB中建立一个脚本文件,代码如下:
a = [ 10 12 23 ; 14 8 6; 27 8 9]
b = a'
运行该文件,显示以下结果:
a =
10 12 23
14 8 6
27 8 9
b =
10 14 27
12 8 8
23 6 9
MATLAB中使用一对中括号“[ ]”,能够将两个矩阵连接起来,创建出一个新矩阵。
MATLAB串联矩阵的两种类型:
在MATLAB中建立一个脚本文件,代码如下:
a = [ 10 12 23 ; 14 8 6; 27 8 9]
b = [ 12 31 45 ; 8 0 -9; 45 2 11]
c = [a, b]
d = [a; b]
运行该文件,显示结果:
a =
10 12 23
14 8 6
27 8 9
b =
12 31 45
8 0 -9
45 2 11
c =
10 12 23 12 31 45
14 8 6 8 0 -9
27 8 9 45 2 11
d =
10 12 23
14 8 6
27 8 9
12 31 45
8 0 -9
45 2 11
MATLAB中如果有两个矩阵 A 和 B ,其中 A 是 mxn 矩阵,B 是 nxp 矩阵,那么他们相乘能够产生一个 mxn 的矩阵 C。
MATLAB矩阵乘法只发生在矩阵 A 的列数的数量等于矩阵 B 的行数的矩阵乘法中,具有相应的列中的第二矩阵乘以第一矩阵中的行的元素。
比如,第(i,j)个位置中的每个元素,在所得的矩阵 C 中,是在第 i 行的第一矩阵具有第二矩阵的第 j 列中的相应元素的产品的元素的总和。
在 MATLAB 中,矩阵乘法使用*运算符。
在MATLAB中建立一个脚本文件,代码如下:
a = [ 1 2 3; 2 3 4; 1 2 5]
b = [ 2 1 3 ; 5 0 -2; 2 3 -1]
prod = a * b
运行该文件,显示以下结果:
a =
1 2 3
2 3 4
1 2 5
b =
2 1 3
5 0 -2
2 3 -1
prod =
18 10 -4
27 14 -4
22 16 -6
MATLAB要计算对应矩阵行列式的值的指令为:d=det(A),该指令返回矩阵 A 的行列式,并把所得值赋给 d。若 A 仅包含整数项,则该结果 d 也是一个整数。
在MATLAB中建立一个脚本文件,代码如下:
a = [ 1 2 3; 2 3 4; 1 2 5]
det(a)
运行该文件,显示以下结果:
a =
1 2 3
2 3 4
1 2 5
ans =
-2
MATLAB中矩阵A的逆矩阵被记为 A−1 ,下面的关系成立:
AA−1 = A−1A = 1
MATLAB中不是每个矩阵都有逆矩阵的,比如一个矩阵的行列式是零的话,则矩阵的逆就不存在,这样的矩阵是奇异的。
MATLAB中,逆矩阵的计算使用 inv 函数:逆矩阵A是inv(A).
在MATLAB中建立一个脚本文件,并输入下面的代码:
a = [ 1 2 3; 2 3 4; 1 2 5]
inv(a)
运行该文件,显示以下结果:
a =
1 2 3
2 3 4
1 2 5
ans =
-3.5000 2.0000 0.5000
3.0000 -1.0000 -1.0000
-0.5000 0 0.5000
在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中的多维数组是正常的两维矩阵的延伸。
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(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]
MATLAB执行上述语句,返回以下结果:
a(:,:,1) =
7 9 5
6 1 9
4 3 2
a(:,:,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...)
注意:
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
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 | 矢量化表达式 |
详细示例
上述的一些函数将由下列例子说明。
长度,尺寸和数量的元素:
在MATLAB中建立一个脚本文件,输入下述代码:
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
循环移位的数组元素:
在MATLAB中建立一个脚本文件,输入下述代码:
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
在MATLAB中建立一个脚本文件,输入下述代码:
v = [ 23 45 12 9 5 0 19 17] % horizonal 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
单元阵列的阵列中每个单元格可以存储不同的维度和数据类型的数组的索引单元格。
单元格函数用于建立一个单元阵列。
单元格函数的语法如下:
C = cell(dim)
C = cell(dim1,...,dimN)
D = cell(obj)
注意
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}
运行该文件,显示以下结果:
c =
'Red' 'Blue' 'Green' 'Yellow' 'White'
[ 1] [ 2] [ 3] [ 4] [ 5]
使用两种方法来引用单元阵列的元素:
括在第一支架的索引,它指的是单元格的集。
单元阵列索引平稳括号单元格集合。
例如:
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c(1:2,1:2)
MATLAB执行上述语句,返回以下结果:
ans =
'Red' 'Blue'
[ 1] [ 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
如果想指定以外的一个增量值,例如:
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相同数量的元素。 |
详细例子
在 MATLAB 中建立一个脚本文件,并输入下述代码:
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 命令提示符访问,这就是所谓的基础工作区的变量。
函数可以接受多个输入参数和可能返回多个输出参数。
函数语句的语法是:
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
下述有个 mymax 函数,它需要五个数字作为参数并返回最大的数字。
建立函数文件,命名为 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 函数有5个输入参数和一个输出参数。
注释行语句的功能后提供的帮助文本。这些线条打印,当输入:
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,这将需要两个数字作为输入并返回第二个数字到第一个数字次幂。
在MATLAB中建立一个脚本文件,并输入下述代码:
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 来计算判别。
在MATLAB中建立一个函数文件 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 函数将是一个嵌套函数。
在MATLAB中建立一个函数文件 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.7321
一个私有函数是一个主要的函数,是只看得见一组有限的其它函数。
如果不想公开的执行的一个函数,可以创建私有函数。
私有函数驻留特殊的名字私人的子文件夹中。
他们是可见的,只有在父文件夹的函数。
详细例子
重写 quadratic 函数。然而,这时计算的判别式 disc 函数,是一个私有函数。
在MATLAB中建立一个子文件夹命名为私人工作目录。它存储在以下函数文件 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-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 quadratic3
可以从命令提示符调用上面的函数为:
quadratic3(2,4,-4)
MATLAB执行上面的语句,返回以下结果:
ans =
0.7321
全局变量可以共享由一个以上的函数。对于这一点,需要将变量声明为全局在所有的函数可使用。
如果想访问该变量从基工作区,然后在命令行声明的变量。
全局声明必须出现在变量中实际上是使用功能。这是一个很好的做法是使用大写字母为全局变量的名称,以区别于其他变量。
详细例子
创建一个函数文件名为 average.m ,输入下述代码:
function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end
在MATLAB中建立一个脚本文件,输入下面的代码:
global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)
运行该文件,显示以下结果:
av =
35.5000
在编写一个程序时,经常需要从外部读入数据。MATLAB使用多种格式打开数据。本章将要介绍MATLAB中数据的导入。
MATLAB中导入数据的方式有两种,分别是在命令行通过代码把数据导进去和通过MATLAB的数据导入向导导入数据。本节将为大家介绍第一种数据导入方法。
MATLAB中导入数据意味着从外部文件加载数据。importdata 函数允许加载各种数据的不同格式的文件。它具有以下五种形式:
S.N. | 函数&说明 |
---|---|
1 | **A = importdata(filename)**将数据从文件名所表示的文件中加载到数组 A 中。 |
2 | A = importdata(’-pastespecial’) 从系统剪贴板加载数据,而不是从文件加载数据。 |
3 | A = importdata(___, delimiterIn) 将 delimiterIn 解释为 ASCII 文件、文件名或剪贴板数据中的列分隔符。可以将 delimiterIn 与上述语法中的任何输入参数一起使用。 |
4 | **A = importdata(___, delimiterIn, headerlinesIn)**从 ASCII 文件、文件名或剪贴板加载数据,并从 lineheaderlinesIn+1 开始读取数字数据。 |
5 | **[A, delimiterOut, headerlinesOut] = importdata(___)**在分隔符输出中返回检测到的分隔符字符,并使用前面语法中的任何输入参数检测headerlinesOut 中检测到的标题行数。 |
示例 1
该例中我们将加载和显示图像文件。
在MATLAB中建立一个脚本文件,并输入下述代码:
filename = 'smile.jpg';
A = importdata(filename);
image(A);
示例 2
本例中,我们在MATLAB中导入文本文件,并指定分隔符和列标题。
我们建立以空格分隔的 ASCII 文件的列标题,文件名为 weeklydata.txt。
文本文件 weeklydata.txt 内容如下:
SunDay MonDay TuesDay WednesDay ThursDay FriDay SatureDay
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
在MATLAB中建立一个脚本文件,并输入下述代码:
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
SatureDay
81.5300
74.6800
74.5100
93.1800
46.6000
示例 3
本例讲的是如何从剪贴板导入数据到MATLAB。
复制到剪贴板中的以下几行:
Mathematics is simple
在MATLAB中建立一个脚本文件,并输入下述代码:
A = importdata('-pastespecial')
运行该文件,显示以下结果:
A =
'Mathematics is simple'
MATLAB 中 importdata 函数是一个高层次的函数。如果要处理低级别的文件,在MATLAB中的 I / O 功能允许读取或写入数据到一个文件中的大部分控制权。但是,使用这些功能的要求是这些文件需要具有更加详细的信息,这样能够提高工作效率。
MATLAB字节或字符的读取和写入操作提供了以下功能:
函数 | 描述 |
---|---|
fclose | 关闭一个或全部已打开的文件 |
feof | 测试文件结尾 |
ferror | 有关文件I / O错误的信息 |
fgetl | 从文件读取行, 删除换行符 |
fgets | 从文件读取行, 保留换行符 |
fopen | 打开文件, 或获取有关打开的文件的信息 |
fprintf | 将数据写入文本文件 |
fread | 从二进制文件读取数据 |
frewind | 将文件位置指示器移动到打开文件的开头 |
fscanf | 从文本文件读取数据 |
fseek | 移动到文件中的指定位置 |
ftell | 获得打开文件的位置 |
fwrite | 将数据写入二进制文件 |
MATLAB 低层次的导入文本数据文件由以下函数实现:
具体例子
我们有 myfile.txt 文本数据文件保存在我们的工作目录。该文件存储3个月的降雨量数据,分别是2012年的6月,7月和8月。
myfile.txt 包含重复的数据集的时间,一个月的雨量测量五个数据项。头数据存储数个月的中号,所以我们有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
%*s %*s %*s %*s
M=%d
', 1);
缺省情况下,fscanf读取数据,直到它可以根据我们的格式说明描述的数据不匹配,或它到达文件末尾的。在这里,我们将使用for循环阅读3组数据,每一次,它会读取7行5列。
我们将创建一个名为 mydata 在工作区中,从文件中读取数据存储结构。这种结构具有三个字段:时间、月和 raindata 阵列。
在MATLAB中建立一个脚本文件,并输入下述代码:
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
%*s %*s %*s %*s
M=%d
', 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 允许你使用数据在另一个应用程序读取 ASCII 文件,MATLAB提供了多种数据输出选项。
你可以建立以下类型的文件:
另外,还可以将数据导出到 Excel。
导出数字阵列作为分隔符的 ASCII 数据文件的方法有两种:
使用 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 作为分隔符。
详细例子
在MATLAB中建立一个脚本文件,并输入下述代码:
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 文件,你可以从一个单元数组的内容
如果使用 SAVE 功能写一个字符数组的 ASCII 文件,它等价 ASCII 码字符写入到文件中。
例如,让我们写的字’hello’的文件:
h = 'hello';
save textdata.out h -ascii
type textdata.out
MATLAB执行上述语句,显示以下结果:
1.0400000e+02 1.0100000e+02 1.0800000e+02 1.0800000e+02 1.1100000e+02
这是字符的字符串 ‘hello’ 的8位 ASCII 格式。
日记文件的活动日志MATLAB的会话。日记函数创建您的会话在磁盘文件的精确副本,不包括图形。
要打开的日记功能,输入:
diary
或者,您可以给日志文件的名字,说:
diary logdata.out
要关闭的日记函数:
diary off
可以在文本编辑器中打开日记文件。
到目前为止,我们已经导出数字阵列。MATLAB提供低级别的 fprintf 函数创建其他文本文件,包括组合的数字和字符数据,非矩形输出文件,或文件中使用非ASCII编码方案。
在低级别的I/O文件活动,在导出之前需要用 fopen 函数打开或创建一个文件,得到的文件标识符。默认情况下,fopen 函数打开一个文件进行只读访问。你应该指定写入的权限或追加,如 ‘w’ 或 ‘a’。
处理文件后,你需要使用 fclose(fid) 函数关闭它。
下面的例子演示了这一概念:
详细例子
在MATLAB中建立一个脚本文件,输入下述代码:
% 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
');
% print values in column order
% two values appear on each row of the file
fprintf(fid, '%f %f
', 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中绘制函数图形的步骤如下:
让我们举一个例子,绘制函数 y = x2。
在这个例子中,我们将绘制两个图形具有相同的函数,但在第二次,我们将减少值的增量。
请注意,因为减少了增量,图形会变得平滑。
在MATLAB中建立一个脚本文件,输入下述代码:
x = [1 2 3 4 5 6 7 8 9 10];
x = [-100:20:100];
y = x.^2;
plot(x, y)
我们可以在 MATLAB 中添加标题,调整 x 轴和 y 轴,网格线,并沿标签美化图形。
详细示例
在MATLAB中建立一个脚本文件,输入下述代码:
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中可以绘制多个图形相同的积点。下面的例子演示了这一概念:
具体示例
在MATLAB中建立一个脚本文件,并输入下述代码:
x = [0 : 0.01: 10];
y = sin(x);
g = cos(x);
plot(x, y, x, g, '.-'), legend('Sin(x)', 'Cos(x)')
MATLAB包含了八个绘制图形的基本颜色选项,下表提供了显示的颜色以及相应的代码:
Color | Code |
---|---|
White | w |
Black | k |
Blue | b |
Red | r |
Cyan | c |
Green | g |
Magenta | m |
Yellow | y |
具体示例
让我们绘制两个多项式的图形:
在MATLAB中建立一个脚本文件,并输入下述代码:
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')
该轴命令允许您设置轴的刻度,您可以提供的最小值和最大值的 x 和 y 轴,使用轴命令的方式如下:
axis ( [xmin xmax ymin ymax] )
具体示例
在 MATLAB 中建立一个脚本文件,并输入下述代码:
x = [0 : 0.01: 10];
y = exp(-x).* sin(2*x + 3);
plot(x, y), axis([0 10 -1 1])
当创建一个数组地块在相同的数字,这些地块被称为子图。
MATLAB 中使用 subplot 命令创建子图。
subplot 命令的语法如下:
subplot(m, n, p)
其中,m 和 n 为积阵列的行和列的数量,p 指定把一个特定的积。
subplot 命令建立的每个绘图都可以有其自己的特点。
具体示例
让我们生成下述的两个图:
在MATLAB中建立一个脚本文件,并输入下述代码:
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 中使用 bar 命令绘制一个二维条形图。
具体示例
如果有一个包含10名学生的教室,这些学生获得的分数的百分比是75,58,90,87,50,85,92,75,60和95,使用这个数据,我们将绘制条形图。
在MATLAB中建立一个脚本文件,并输入下述代码:
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
contour 线的两个变量的函数的曲线,沿着该函数具有一个恒定值。加入等于标高点,一个给定的水平,如平均海平面以上用于创建等高线图等高线。
MATLAB 提供了一个轮廓绘制等高线图的函数。
具体例子
让我们生成的等高线图,显示了对于一个给定的功能的轮廓线 g = f(x, y)。这个函数有两个变量,因此,我们将生成两个独立的变量,即两个数据集 x 和 y。这是通过调用 meshgrid 命令。
meshgrid 命令是用于产生一个矩阵的元素,赋予 x 和 y 的范围内进行了在每一种情况下的增量同规格一起。
让我们绘制函数 g = f(x, y), where −5 ≤ x ≤ 5, −3 ≤ y ≤ 3,这两个值的增量为0.1。这些变量设置语法为:
[x,y] = meshgrid(–5:0.1:5, –3:0.1:3);
最后,我们需要分配功能,函数是:x2 + y2
在 MATLAB 中一个脚本文件,并输入下述代码:
[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
让我们修改代码,慢慢美化该等高线图:
[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
三维绘图基本显示两个变量中的一个函数定义的表面,g = f (x,y)。
像以前一样,定义 g,我们首先创建一组点(X,Y)函数,使用 meshgrid 命令在域;接下来,我们该函数本身分配;最后使用 surf 命令来创建曲面图。
具体示例
让我们建立一个三维地图函数表面 g = xe-(x2 + y2)
在MATLAB中建立一个脚本文件,并输入下述代码:
[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps
MATLAB中也可以使用的网格的命令来生成一个三维表面。然而,surfcommand 显示连接线和面的表面的颜色,而 meshcommand 创建一个线框表面色线,连接定义点。
MATLAB 中使用 solve 命令求解代数方程组。在其最简单的形式,solve 函数需要括在引号作为参数方程。
例如,让我们在方程求解 x, x-5 = 0
solve([x-5=0])
MATLAB执行上述语句,返回下述结果:
ans =
5
还可以调用求解函数为:
y = solve([x-5 = 0])
MATLAB执行上述语句,返回以下结果:
y =
5
甚至可能不包括的右边的方程:
solve([x-5])
MATLAB执行上述语句,返回以下结果:
ans =
5
然而,如果公式涉及多个符号,那么MATLAB默认情况下,假定正在解决 x,解决命令具有另一种形式:
solve(equation, variable)
在那里,还可以提到的变量。
例如,让我们来解决方程 v – u – 3t2 = 0, 或 v 在这种情况下,我们应该这样写:
solve([v-u-3*t^2=0], [v])
MATLAB执行上述语句,返回以下结果:
ans =
3*t^2 + u
根命令用于求解代数方程组 Octave ,可以写上面的例子如下:
例如,让我们在方程求解x , x-5 = 0
roots([1, -5])
Octave 执行上述语句,返回以下结果:
ans =
5
还可以调用求解函数为:
y = roots([1, -5])
Octave 执行上述语句,返回以下结果:
y =
5
solve 命令也可以解决高阶方程。它经常被用来求解二次方程,该函数返回在数组中的方程的根。
下面举例子解决二次方程 x2 -7x +12 = 0。
在MATLAB中建立一个脚本文件,并输入下述代码:
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
下面的例子解决二次方程 x2 -7x +12 = 0 在 Octave 中。创建立一个脚本文件,并输入下述代码:
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
solve 命令还可以解决高阶方程。例如,让我们来解决一个三次方程 (x-3)2(x-7) = 0
solve([(x-3)^2*(x-7)=0])
MATLAB执行上述语句,返回以下结果:
ans =
3
3
7
在高阶方程的情况下,根长含有许多术语。可以得到的数值如根,把它们转换成一倍。
下面的例子解决了四阶方程 x4 − 7x3 + 3x2 − 5x + 9 = 0.
在MATLAB中建立一个脚本文件,并输入下述代码:
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
请注意,在过去的两个根是复数。
下面的例子解决了四阶方程 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
solve 命令也可以用于生成涉及一个以上的变量的方程系统的解决方案。
我们求解方程:
5x + 9y = 5
3x – 6y = 4
在MATLAB中建立一个脚本文件,并输入下述代码:
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
我们有一点点不同的方法来解决系统 ‘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 命令用于扩展,并分别收集一个方程。下面的示例演示的概念:
当工作中有许多象征性的函数,你应当声明你的变量是象征意义的。
在MATLAB中建立一个脚本文件,并输入下述代码:
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
你需要 symbolic 包,它提供了expand 和 collect 命令来扩大和收集方程。下面的示例演示的概念:
当工作中有许多象征意义的函数,应该声明变量是象征性的,但八度有不同的方法来定义符号变量。注意使用 sin 和 cos,他们还象征意义性的包中定义。
建立一个脚本文件,并输入下述代码:
% 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 命令表达式 factorizes 是一个简化命令的简化表达。
具体例子
建立一个脚本文件,并输入下述代码:
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 中如果要限制计算就要使用 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 您使用的符号变量。
limit 命令也可以计算一个函数的限制,作为变量趋于零以外的一些数字。
为了计算 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
以下是上面的例子中使用 symbolic 包 Octave 版本,尝试执行和比较的结果:
pkg load symbolic
symbols
x=sym("x");
subs((x^3+5)/(x^4+7),x,0)
Octave 执行上面的语句,并返回以下结果:
ans =
0.7142857142857142857
代数极限定理提供了一些基本的性能限制。
如下所示:
limx->p ( f(x) + g(x)) = limx->p f(x) + limx->p g(x)
limx->p (f(x)- g(x)) = limx->p f(x) - limx->p g(x)
limx->p (f(x)· g(x)) = limx->p f(x)· limx->p g(x)
limx->p (f(x)/g(x)) = limx->p f(x)/ limx->p g(x)
我们考虑两个函数:
让我们计算为 x 的函数的限制的倾向 5,这两个函数和验证限制使用这两个函数和MATLAB的基本属性。
详细例子
在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
以下是上面的例子中使用 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
当一个函数具有某些特定变量的值的不连续性,限制在这一点上不存在。换句话说,限制具有不连续的函数f(x)在x = a ,当不相等的值的限制,当 x 趋向 x 从左侧的值限制为 x 的方法。
这导致的概念左手侧 和右手侧 限制。a限值定为左手侧 x > a 限制,从左侧,即 X 接近的值的 xa 。当是不相等的左手系的限制和右手限制,该限制不存在。
让我们考虑一个函数:
f(x) = (x - 3)/|x - 3|
我们将证明 limx->3 f(x) 不存在。 MATLAB帮助我们建立这个事实在两个方面:
左手侧和右手侧限制,计算传递字符串 ‘左’ 和 ‘右’ limit 命令的最后一个参数。
具体示例
在MATLAB中建立一个脚本文件,并输入下述代码:
f = (x - 3)/abs(x-3);
ezplot(f,[-1,5])
l = limit(f,x,3,'left')
r = limit(f,x,3,'right')
显示下面的输出:
l =
-1
r =
1
在 MATLAB 中,多项式用一个行向量表示,行向量的元素值为多项式系数按幂次的降序排列。
例如,方程 P(x) = x4 + 7x3 - 5x + 9 可以表示为:
p = [1 7 0 -5 9];
MATLAB中 polyval 函数用于将指定的值 - 计算多项式。例如,要计算我们本节开始时举例的多项式 p, x = 4,输入:
p = [1 7 0 -5 9];
polyval(p,4)
MATLAB 执行上述语句,返回以下结果:
ans =
693
MATLAB 还提供了计算矩阵多项式 polyvalm 函数。矩阵多项式一个多项式矩阵变量。
例如,我们建立一个正方形矩阵 X 并计算多项式 p:
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
根函数可以计算多项式的根。
例如,要计算多项式 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 函数是根函数,并返回多项式的系数的倒数。
例如:
p2 = poly(r)
MATLAB执行上述语句,返回以下结果:
p2 =
1.0000 7.0000 0.0000 -5.0000 9.0000
polyfit 函数找到一个多项式的系数,适合采用最小二乘意义上的一组中的数据。
如果 x 和 y 是两个向量含有的 x 和 y 被拟合数据的一个 n 次多项式,那么我们得到的多项式拟合的数据通过写入
p = polyfit(x,y,n)
详细例子
在MATLAB中建立一个脚本文件,并输入下述代码:
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提供的拉普拉斯,傅里叶和FFT命令拉普拉斯,傅里叶和快速傅里叶变换工作。
时间函数 f(t)的拉普拉斯变换的函数,通过下式给出下面的积分:
拉普拉斯变换的变换函数 f(t)也表示为,F(次)。可以看到这种变换或一体化进程的符号变量t的函数,F(T),转换成另一个函数F(s)和另一个变量s。
拉普拉斯变换将微分方程转化为代数。要计算一个函数 f(t)的拉普拉斯变换,这样写:
laplace(f(t))
具体示例
接下来,我们会计算一些常用函数的拉普拉斯变换。
在MATLAB中建立一个脚本文件,并输入下述代码:
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
详细例子
在MATLAB中建立一个脚本文件,并输入下述代码:
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的频谱。
详细例子
在MATLAB中建立一个脚本文件,并输入下述代码:
syms x
f = exp(-2*x^2); %our function
ezplot(f,[-2,2]) % plot of our function
FT = fourier(f) % Fourier transform
并显示以下结果:
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))
本教程总结参考https://www.w3cschool.cn/matlab/
如果你发现文章有什么问题,欢迎留言指正。
如果你觉得这篇文章还可以,别忘记点个赞加个关注再走哦。
如果你不嫌弃,还可以关注微信公众号———梦码城(持续更新中)。
梦码在这里感激不尽!!