概述
文章目录
- 命令操作
- 矩阵和数组
- 多维数组
- 元胞数组
- 矩阵运算符
- 数组运算符
- 构建表
- 行和列的删除
- 函数
- 自定义函数
- 结构体
- 线性方程组
- 绘图函数
- 编程
- 条件控制-if、else、switch
- 循环控制
命令操作
使用 MATLAB 时,可发出创建变量和调用函数的命令。变量名称包括一个字母,后面可以跟随任意数目的字母、数字或下划线,MATLAB 区分大小写;它可以区分大写和小写字母。A 和 a 不是相同变量。如果未指定输出变量,MATLAB 将使用变量 ans(answer 的缩略形式)来存储计算结果。
sin(a)
ans =
0.8415
如果语句以分号结束,MATLAB 会执行计算,但不在命令行窗口中显示输出。
MATLAB 使用传统的十进制记数法以及可选的小数点和前导加号或减号来表示数字。整数的可用精度为 8 位、16 位、32 位和 64 位。科学记数法使用字母e 来指定 10 次方的缩放因子。虚数使用 i 或 j 作为后缀。sort 函数根据量值进行排序,如果量值相等,则根据相位角度排序。如:sort([3+4i, 4+3i])
ans = 4.0000 + 3.0000i 3.0000 + 4.0000i
“等于”关系运算符 == 要求实部和虚部相等。其他二进制关系运算符 >、<、>= 和 <= 忽略数字的虚部,仅考虑实部。
按向上 (↑) 和向下箭头键 (↓) 可以重新调用以前的命令。在空白命令行中或在键入命令的前几个字符之后按箭头键。例如,要重新调用命令a= 1,请键入 a,然后按向上箭头键。键入几个字符并按 ↑ 键可查找前文中以这些字符开头行。还可以从命令历史记录中复制以前执行的语句。
使用 whos 可以查看工作区的内容。退出 MATLAB 后,工作区变量不会保留。使用 save 命令保存数据以供将来使用:save 文件名.mat。使用 clear 命令要清除工作区中的所有变量。使用 load 将 MAT 文件中的数据还原到工作区:load 文件名.mat
如果语句无法容纳在一行中,请使用省略号(三个句点)…,后跟 Return 或 Enter 以指示该语句在下一
行继续。例如,
s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 …
-1/8 + 1/9 - 1/10 + 1/11 - 1/12;
=、+ 和 - 符号周围的空格是可选的,但可提高可读性。
矩阵和数组
MATLAB主要用于处理整个的矩阵和数组,而其他编
程语言大多逐个处理数值。所有 MATLAB 变量都是多维数组,与数据类型无关。矩阵是指通常用来进行线性代数运算的二维数组。
以元素列表方式创建矩阵须遵守的规则有:
- 使用空格或逗号分隔行的元素。
- 使用分号 ; 表示每行末尾。
- 使用方括号 [ ] 将整个元素列表括起来。
a = [1 3 5; 2 4 6; 7 8 10]
a = 3×3
1 3 5
2 4 6
7 8 10
创建矩阵的另一种方法是使用 ones(全为一)、zeros(全为零)、rand(均匀分布随机元素)或randn(正态分布的随机元素)函数。例如,创建一个由零组成的 5×1 列向量。z = zeros(1,5)
MATLAB 允许您使用单一的算术运算符或函数来处理矩阵中的所有值。
sin(a)
ans = 3×3
0.8415 0.1411 -0.9589
0.9093 -0.7568 -0.2794
0.6570 0.9894 -0.5440
多维数组
MATLAB 中的多维数组是具有多个下标的数组。创建多维数组的一种方法是调用具有多个参数的zeros、ones、rand 或 randn。
元胞数组
MATLAB 中的元胞数组是以其他数组的副本为元素的多维数组。使用 cell 函数可以创建空矩阵的元胞数组。但是,更普遍的做法是,通过将其他内容的集合括入花括号 {} 中来创建元胞数组。花括号还可以与下标配合使用,以便访问各个元胞的内容。如:
C = {A sum(A) prod(prod(A))} %将A矩阵不同维的元素的乘积返回到矩阵
生成一个 1×3 元胞数组。这三个元胞包含幻方矩阵、列总和的行向量及其所有元素的乘积。
请牢记以下两大要点。第一,要检索某个元胞的内容,请在花括号中使用下标。例如,C{1} 检索幻方矩阵,C{3} 为 16!。第二,元胞数组包含其他数组的副本,而不包含指向这些数组的指针。如果随后更改A,C不会发生变化。
元胞数组和三维矩阵的区别:三维数组可以存储相同大小的矩阵序列。元胞数组可用于存储不同大小的矩阵序列。
矩阵运算符
表达式使用大家熟悉的算术运算符和优先法则。
对于实矩阵,转置运算对
a
i
j
a_{ij}
aij 和
a
j
i
a_{ji}
aji 进行交换。对于复矩阵,还要考虑是否用数组中复数项的复轭来形成复共轭转置。MATLAB 使用撇号运算符(‘) 执行复共轭转置,使用点撇号运算符 (.’) 执行无共轭的转置。对于包含所有实数元素的矩阵,这两个运算符返回相同结果。
z = [1+2i 7-3i 3+4i; 6-2i 9i 4+7i]
z的复共轭转置为z’为:
1.0000 - 2.0000i 6.0000 + 2.0000i
7.0000 + 3.0000i 0.0000 - 9.0000i
3.0000 - 4.0000i 4.0000 - 7.0000i
非共轭复数转置(其中每个元素的复数部分保留其符号)表示为 z.‘:
1.0000 + 2.0000i 6.0000 - 2.0000i
7.0000 - 3.0000i 0.0000 + 9.0000i
3.0000 + 4.0000i 4.0000 + 7.0000i
对于复数向量,两个标量积 x’*y 和 y’*x 互为复共轭数,而复数向量与其自身的标量积 x’*x 为实数。
数组运算符
如果矩阵不用于线性代数运算,则成为二维数值数组。数组的算术运算按元素执行。这意味着,加法和减法运算对数组和矩阵都是相同的,但乘法运算不相同。
例如,确认矩阵乘以其逆矩阵可返回单位矩阵:p = a*inv(a)。p 不是整数值矩阵。MATLAB 将数字存储为浮点值,算术运算可以区分实际值与其浮点表示之间的细微差别。使用 format 命令可以显示更多小数位数:
format long
p = a*inv(a)
p = 3×3
0.999999999999996 0 0
0 1.000000000000000 0
0 0 0.999999999999998
使用format short;命令将显示内容重置为更短格式 ;format 仅影响数字显示,而不影响 MATLAB 对数字的计算或保存方式。
要执行元素级乘法(而非矩阵乘法),请使用 .* 运算符:p = a.*a ;除法和幂的矩阵运算类似,如:a.^3
ans = 3×3
1 27 125
8 64 216
343 512 1000
串联是连接数组以便形成更大数组的过程。实际上,第一个数组是通过将其各个元素串联起来而构成的。成对的方括号 [] 即为串联运算符。使用逗号将彼此相邻的数组串联起来称为水平串联。每个数组必须具有相同的行数。同样,如果各数组具
有相同的列数,则可以使用分号垂直串联。A=[a,a;a,a]
A = 6×6
1 3 5 1 3 5
2 4 6 2 4 6
7 8 10 7 8 10
1 3 5 1 3 5
2 4 6 2 4 6
7 8 10 7 8 10
可以使用sum()函数对矩阵的行列元素进行求和,列求和:sum(A);行求和: sum(A’)。使用diag()函数可以求主对角元素,配合使用sun()函数即可求主对角元素和。使用原本用于图形的函数 fliplr 可以从左往右地翻转矩阵,即求副对角元素和的命令为:sum(diag(fliplr(A)))。magic(n)返回由整数1到n^2构成的n乘n矩阵,行和列的和相等。 顺序n必须是大于或等于3的标量。 可以使用B(:,[1 3 2 4])命令使矩阵按照指定顺序对列进行重新排序。
复数包含实部和虚部,虚数单位是 -1 的平方根。要表示复数的虚部,请使用 i 或 j。用法和实数相同。例如:sqrt(-1)
ans = 0.0000 + 1.0000i
MATLAB中的每个变量都是一个可包含许多数字的数组。如果要访问数组的选定元素,请使用索引。
例如,假设有 4×4 矩阵 A:A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
引用数组中的特定元素有两种方法。最常见的方法是指定行和列下标,例如A(4,2)。另一种方法不太常用,但有时非常有用,即使用单一下标按顺序向下遍历每一列:A(8)。在赋值语句右侧引用数组外部元素,MATLAB 会引发错误,如test = A(4,5)。不过,可以在赋值语句左侧指定当前维外部的元素。数组大小会增大以便容纳新元素。A(4,5) = 17
A = 4×5
1 2 3 4 0
5 6 7 8 0
9 10 11 12 0
13 14 15 16 17
要引用多个数组元素,请使用冒号运算符,这使您可以指定一个格式为 start:end 的范围。例如,列出 A前三行及第二列中的元素:A(1:3,2),单独的冒号(没有起始值或结束值)指定该维中的所有元素。例如,选择 A 第三行中的所有列:
A(3,:)。此外,冒号运算符还允许您使用较通用的格式 start:step:end 创建等间距向量值。
B = 0:10:100
B = 1×11
0 10 20 30 40 50 60 70 80 90 100
构建表
数组运算对构建表非常有用。假定 n 为列向量:n = (0:9)';用pows = [n n.^2 2.^n]命令构建一个平方和 2 次幂的表 。
当处理文本时,将字符序列括在双引号中。可以将文本赋给变量。如果文本包含双引号,请在定义中使用两个双引号。可以使用“+”符号进行文本的拼接,如:
q = "Something ““quoted”” and something " + “else”
q = “Something “quoted” and something else.”
与数值数组类似,字符串数组可以有多个元素。使用 strlength 函数求数组中每个字符串的长度。如:A = [“a”,“bb”,“ccc”; “dddd”,“eeeeee”,“fffffff”]
strlength(A)
ans =
1 2 3
4 6 7
字符数组使用单引号;字符在内部作为数字存储;数组的每个元素都包含单个字符,将字符数组转换为数值矩阵,该矩阵包含每个字符的 ASCII 代码的浮点表示。;使用方括号串联字符数组。注意垂直拼接时,两字符数组的长度应相同。
seq = ‘GCTAGAATCC’;seq(4);
ans = ‘A’
seq2 = [seq ‘ATTAGAAACC’]
seq2 =‘GCTAGAATCCATTAGAAACC’
要操作包含不同长度的行的文本主体,您有两种选择,即使用填充的字符数组或使用字符向量元胞数组。创建字符数组时,数组各行的长度必须相同。(使用空格填充较短行的末尾。)char 函数可执行这种填充操作。例如:S = char(‘A’,‘rolling’,‘stone’,‘gathers’,‘momentum.’),生成一个 5×9 字符数组:
S =
A
rolling
stone
gathers
momentum.
再者,您也可以将文本存储在元胞数组中。例如,C = {‘A’;‘rolling’;‘stone’;‘gathers’;‘momentum.’}
创建一个不需要任何填充的 5×1 元胞数组,因为该数组的各行可以具有不同的长度。使用以下语句可以将填充后的字符数组转换为字符向量元胞数组:
C = cellstr(S);
使用以下语句可以逆转此过程
S = char©;
行和列的删除
矩阵中行和列的删除使用方括号,删除 X 的第二列的命令为X(:,2) = []。单个元素不能使用行列下标的方法删除,会报错。可以使用单一下标删除某个元素,并将其他元素重构为一个行向量。
函数
MATLAB 提供了大量标准初等数学函数,包括 abs、sqrt、exp 和 sin。生成负数的平方根或对数不会导致错误;系统会自动生成相应的复数结果。要调用函数,例如 max,请将其输入参数括在圆括号中,如果存在多个输入参数,请使用逗号加以分隔,如union(A,B);如果存在多个输出参数,请将其括在方括号中:[minA,maxA] = bounds(A)。MATLAB 还提供了许多其他高等数学函数,包括贝塞尔函数和gamma 函数。其中的大多数函数都接受复数参数。有关初等数学函数的列表,可以输入 help elfun 查看;有关更多高等数学函数和矩阵函数的列表,可以输入help specfun 和 help elmat 命令查看。
一些特殊函数提供了常用的常量值。
isprime() 判断是否为素数
isfinite(x) 判断是否为有限数值
find() 返回符合逻辑条件的数组元素的索引下标
perms(v) v是一个长度为n的行向量,此函数产生v中这n个元素的全排列矩阵,每行为一个排列。矩阵P包含有n!行和n列
pascal(n) Pascal矩阵的第一行元素和第一列元素都为1,
A
i
,
j
A_{i,j}
Ai,j=
A
i
,
j
−
1
A_{i,j-1}
Ai,j−1+
A
i
−
1
,
j
A_{i-1,j}
Ai−1,j
magic(n) 创建一个非对称幻方矩阵,它的行总和与列总和相等:
randi(10,3,2) 第一个输入描述整数可能值的范围,后面两个输入描述行和列的数量。
eye(m,n) 返回 m×n 矩形单位矩阵,eye(n) 返回 n×n 单位方阵
inv(A) 对矩阵A求逆(或式A^-1 )
det(A) 由矩阵描述的线性变换的缩放因子(行列式的值)。当行列式正好为零时,矩阵为奇异矩阵,
因此不存在逆矩阵。
cond(A):计算矩阵求逆结果的精度。条件数的范围是从 1(数值稳定的矩阵)到 Inf(奇异矩阵)
rank - 矩阵的秩
kron(X,Y) :两个矩阵的 Kronecker 乘积,为 X 的元素与 Y 的元素的所有可能乘积构成的较大矩阵。如果 X为 m×n 且 Y 为 p×q,则 kron(X,Y) 为 mp×nq。即结果为:
[X(1,1)*Y X(1,2)*Y . . . X(1,n)*Y
. . .
X(m,1)*Y X(m,2)*Y . . . X(m,n)*Y]
disp(A) 显示A的值
B=blkdiag(A1,A2,…,AN) 创建分块对角矩阵
linspace(X1,x2) 生成线性间距向量,生成x1到x2间100个点
logspace 生成对数间距向量,生成一个由在 10^a 和 10^b之间的 50 个对数间距点组成的行向量 y
freqspace 频率响应的频率间距
[X,Y] = meshgrid(x,y) 二维和三维网格,坐标 X 和 Y 表示的网格有 length(y) 个行和 length(x) 个列。
[X1,X2,…,Xn] = ndgrid(x1,x2,…,xn) N 维空间中的矩形网格,复制网格向量 x1,x2,…,xn 以生成 n 维满网格。
B = cast(A,newclass) 将 A 转换为数据类型(类)newclass。
Y = typecast(X,type) 不更改x存储的01内容,只是转换数据格式。
自定义函数
函数的第一行以关键字 function 开头。它提供函数名称和参数顺序。本示例中具有两个输入参数和一个输出参数。第一个空行或可执行代码行前面的后续几个行是提供帮助文本的注释行。当键入 help rank 命令时,会输出这些几行内容。
可以采用多种不同方法使用 rank 函数:
rank(A)
r = rank(A)
r = rank(A,1.e-6)
许多函数都按此方式运行。如果未提供输出参数,结果会存储在 ans 中。如果未提供第二个输入参数,此函数会运用默认值进行计算。函数体中提供了两个名为 nargin 和 nargout 的数量,用于告知与函数的每次特定使用相关的输入和输出参数的数目。
- 匿名函数
匿名函数是一种简单形式的 MATLAB 函数,该函数在一个 MATLAB 语句中定义。它包含一个 MATLAB表达式和任意数目的输入和输出参数。您可以直接在 MATLAB 命令行中定义匿名函数,也可以在函数或脚本中定义匿名函数。这样,您可以快速创建简单函数,而不必每次为函数创建文件。如:sqr = @(x) x.^2;
使用时输入 sqr(5) 命令
[y1,…,yN] = feval(fun,x1,…,xM) 计算函数
C = bsxfun(fun,A,B) 对数组 A 和 B 应用函数句柄 fun 指定的按元素二元运算。
MATLAB程序文件可以包含用于多个函数的代码。在函数文件中,第一个函数称为主函数。此函数对其他文件中的函数可见,或者也可以从命令行调用它。文件中的其他函数称为局部函数,它们可以任意顺序出现在主函数后面。局部函数仅对同一文件中的其他函数可见。它们等效于其他编程语言的子例程,有时被称为子函数。
私有函数是一种主函数。其特有的特征是:仅对一组有限的其他函数可见。私有函数位于带专有名称 private 的子文件夹中。它们是仅可在母文件夹中可见的函数。例如,假定文件夹 newmath 位于 MATLAB 搜索路径中newmath 的名为 private 子文件夹可包含只能供 newmath中的函数调用的特定函数。由于私有函数在父文件夹外部不可见,因此可以使用与其他文件夹中的函数相同的名称。 MATLAB 在标准函数之前搜索私有函数。
如果您想要多个函数共享一个变量副本,只需在所有函数中将此变量声明为global。如果您想要基础工作区访问此变量,请在命令行中执行相同操作。全局声明必须在函数中实际使用变量之前进行。
结构体
结构体是多维 MATLAB 数组,包含可按文本字段标志符访问的元素。可以一次添加一个字段,也可以使用一个语句添加整个元素:
S(1).name = ‘Toni Miller’;
S(1).score = 91;
S(1).grade = ‘A-’;
S(2) = struct(‘name’,‘Jerry Garcia’,‘score’,70,‘grade’,‘C’)
将不同字段重新组合为其他 MATLAB 数组的方法有许多种。这些方法大多基于逗号分隔列表的表示法。键入S.score与键入S(1).score, S(2).score, S(3).score;相同,这是一个逗号分隔列表。如果将生成此类列表的表达式括在方括号中,MATLAB 会将该列表中的每一项都存储在数组中。在本示例中,MATLAB 创建一个数值行向量,该向量包含结构体数组 S 的每个元素的 score 字段:
scores = [S.score]
scores =
83 91 70
访问结构体中的数据的最常用方法是指定要引用的字段的名称。访问结构体数据的另一种方法是使用动态
字段名称。这些名称将字段表示为变量表达式,MATLAB 会在运行时计算这些表达式。显示的点-括号
语法将 expression 作为动态字段名称:
structName.(expression)
以计算考试的平均分数的函数为例:
function avg = avgscore(testscores, student, first, last)
for k = first:last
scores(k) = testscores.(student).week(k);
end
avg = sum(scores)/(last - first + 1);
testscores.Ann_Lane.week(1:25) = [95 89 76 82 79 92 94 92 89 81 75 93 85 84 83 86 85 90 82 82 84 79 96 88 98];
testscores.William_King.week(1:25) =[87 80 91 84 99 87 93 87 97 87 82 89 86 82 90 98 75 79 92 84 90 93 84 78 81];
现在,运行 avgscore,并在运行时使用动态字段名称为 testscores 结构体提供学生姓名字段:
avgscore(testscores, ‘Ann_Lane’, 7, 22)
ans = 85.2500
avgscore(testscores, ‘William_King’, 7, 22)
ans = 87.7500
线性方程组
MATLAB 使用标量示例中常见的除法术语来描述常规联立方程组的解。斜杠 / 和反斜杠 这两个除号分别对应 MATLAB 函数 mrdivide 和mldivide。两种运算符分别用于未
知矩阵出现在系数矩阵左侧或右侧的情况:
x = b/A 表示使用 mrdivide 获得的矩阵方程 xA = b 的解。
x = Ab 表示使用 mldivide 获得的矩阵方程 Ax = b 的解。
绘图函数
plot 函数具有不同的形式,具体取决于输入参数。如果 y 是向量,plot(y) 会生成 y 元素与 y 元素索引的分段线图。如果有两个向量被指定为参数,plot(x,y) 会生成 y 对 x 的图形。
通过调用一次 plot,多个 x-y 对组参数会创建多幅图形。指令为plot(x,y,x,y2,x,y3)。legend(‘y’,‘y2’,‘y3’)函数提供了一种标识各条线的简单方法。
使用 plot 命令绘制数据时,可以指定颜色、线型和标记(例如加号或圆圈):plot(x,y,‘color_style_marker’)。例如,
plot(x,y,‘r:+’)
MATLAB 在 x-y 平面中的网格上方使用点的 z 坐标来定义曲面图,并使用直线连接相邻的点。mesh 和surf 函数以三维形式显示曲面图。mesh 生成仅使用颜色来标记连接定义点的线条的线框曲面图。surf 使用颜色显示曲面图的连接线和面。
meshgrid是MATLAB中用于生成网格采样点的函数。[X,Y] = meshgrid(x,y)返回的两个矩阵X、Y必定是行数、列数相等,行数都等于输入参数y中元素的总个数,列数都等于输入参数x中元素总个数。
以绘制的二维 sinc 函数 sin®/R为例:
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin®./R;
曲面图的矩形面是彩色的。各个面的颜色由 Z 的值及颜色图(即颜色的有序列表)决定,其命令为:
surf(X,Y,Z)
colormap hsv
colorbar
可以通过设定alpha的值指定透明度,。Alpha 值的范围介于 0(完全透明)和 1(不透明)之间:如alpha(.4);
imshow(I,[G]):图像显示,参数I表示一个二维图像数组,G表示该图像的灰度级数,默认为256.
imread(‘地址’):图片的读入
imwrite(‘文件名.格式’):图片的保存
- h = plot(x, x.^3);
get(h) 查看对象的属性
set(h,‘Marker’,‘s’,‘MarkerFaceColor’,‘g’) 设置多个属性,将 Marker 属性设置为
正方形,并将 MarkerFaceColor 属性设置为绿色,可以使用元胞数组对h坐标系中的线条设置不同属性。
编程
条件控制-if、else、switch
其基本语法结构如示例:
a = randi(100, 1);
if a < 30
disp('small')
elseif a < 80
disp('medium')
else
disp('large')
end
当 A 和 B 为矩阵时,用 A == B 不会测试二者是否相等,而会测试二者相等的位置;结果会生成另一个由 0 和 1 构成的矩阵,并显示元素与元素的相等性。检查两个变量之间的相等性的正确方法是使用 isequal(A, B)函数,其返回 1(表示 true)或 0(表示 false)的标量逻辑值。
循环控制
continue 语句将控制传递给它所在的 for 循环或 while 循环的下一迭代,并跳过循环体中的任何其余语句。此道理同样适用于嵌套循环中的continue 语句。也就是说,执行会从遇到 continue 语句的循环开头继续。
break 语句用于提前从 for 循环或 while 循环中退出。在嵌套循环中,break 仅从最里面的循环退出。
return 终止当前命令序列,并将控制权返回给调用函数或键盘。此外,return 还用于终止 keyboard模式。被调用的函数通常在到达函数末尾时将控制权转交给调用它的函数。您可以在被调用的函数中插入一个 return 语句,以便强制提前终止并将控制权转交给调用函数。
matlab中判断和循环命令用法和其他编程语言相同,只是格式不同
执行 try 块中的语句并在 catch 块中捕获产生的错误。如果 try 块中的任何语句生成错误,程序控制将立即转至包含错误处理语句的 catch 块.
pause 暂停执行matlab并等待用户按下任意键。
pasue(n) 暂停n秒
parfor (loopvar = initval:endval, M); statements; end 并行计算,将loopvar代入statements,最多M个线程。
最后
以上就是乐观夏天为你收集整理的MATLAB入门自定义函数的全部内容,希望文章能够帮你解决MATLAB入门自定义函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复