项目需要用到matlab,我是这方面的小白。做一下简单的笔记,仅供自己查阅使用。
《MATLAB 入门之旅》视频教程
https://matlabacademy.mathworks.com/R2022a/cn/portal.html?course=gettingstarted#chapter=1&lesson=1§ion=1
您可以通过在命令行窗口中 MATLAB 提示符 (>>) 后输入命令,然后按 Enter 键来执行命令。
任务 使用命令 3*5 将数值 3 和 5 相乘。
任务 1 ✔
>> 3*5
ans =
15
任务 1
ans
的变量除非另有指定,否则 MATLAB 会将计算结果存储在一个名为 ans
的变量中。
>> 7 + 3
ans =
10
任务
将 3*5 的计算结果赋给一个名为 m 的变量,如下所示:
m = 3*5
MATLAB 中的等号 (=) 是赋值运算符,这意味着等号右侧的表达式赋给左侧的变量。
当您输入 x = 3 + 4 时,MATLAB 首先计算 3 + 4,然后将结果 (7) 赋给变量 x。
任务 输入命令
m = m + 1
,看看会出现什么。
请注意,工作区窗口(右侧)显示了当前位于工作区中的所有变量。
任务 创建一个名为 y 并且值为 m/2 的变量。
在命令的末尾添加分号将抑制输出,但仍会执行该命令,正如您在工作区中所看到的。当您输入命令而没有以分号结尾时,MATLAB 将会在命令提示符下显示结果。
>> x = 5 + 1
x =
6 >> x = 5 + 1;
任务
输入 k = 8 - 2;,结尾用分号。结果不会出现在命令提示符下,但您可以在工作区窗口中看到该值。
您可以按键盘上的向上箭头键重新调用以前的命令。请注意,要执行此操作,命令行窗口必须为活动窗口。
任务 按向上箭头键以回到命令 m = 35,然后将该命令编辑为 m = 3k
当您在命令提示符下仅输入变量名称时,MATLAB 将会返回该变量的当前值。
任务 y 的值是使用 m 计算的。修改 m 时,是否重新计算 y?
在命令提示符下只输入变量名称 y(并按 Enter)。
修改m时,y不会重新计算。
您可以将 MATLAB 变量命名为符合以下规则的任何名称:以字母开头,并且仅包含字母、数字和下划线 (_)
。
MATLAB 变量还区分大小写
。
任务 将值 -2 赋给变量 A。
请注意,变量 a 和 A 都存在于工作区中。
您可以将您的所有变量命名为 a 或 x,但对变量进行更有意义的命名会更有用。
任务 计算 a+A 2 。将结果赋给变量 avgAa。
如果您使用无效的变量名称,MATLAB 会显示建议的更正内容。您可以使用建议的命令、对其进行修改或按 Esc 键删除建议。
试着创建变量 3sq = 9 来试验一下这些操作。
您可以使用 save 命令将工作区中的变量保存到称为 MAT 文件的 MATLAB 特定格式文件中。
要将工作区保存到名为 foo.mat 的 MAT 文件中,请使用命令:
>> save foo
任务
将工作区变量保存到名为 datafile.mat 的文件中。
正确结果:
save datafile
当您要在 MATLAB 中切换处理新问题时,可能需要整理工作区。您可以使用 clear 函数从工作区中删除所有变量。
任务
使用 clear 将工作区清空。
在工作区中,您可以看到 clear 命令清空了所有变量。
您可以使用 load 命令从 MAT 文件加载变量。
>> load foo
任务 从文件 datafile.mat 加载变量。
请注意,变量 data 在工作区中列出。您可以通过输入变量的名称来查看任何变量的内容。
>> myvar
任务 显示变量 data 的内容。
clear
函数清理工作区。clc
命令清理命令行窗口。
任务 使用
clc
命令清空命令行窗口。
当您关闭 MATLAB 时,工作区将被清空。可以使用 MAT 文件来保存变量。这样,当您重新打开 MATLAB 时,可以将变量加载到工作区中。
如果您只想加载或保存部分变量,可以使用函数的两个输入。尝试从文件 myData.mat 中仅加载变量 m:
>> load myData m
然后尝试将变量 m 保存到名为 justm.mat 的新 MAT 文件中:
>> save justm m
MATLAB 包含一些内置的常量,例如用 pi 表示 π。
>> a = pi
a =
3.1416
这里虽然只对 π 显示了四位小数,但它在内部是用更高的精度表示的。
任务 创建一个名为 x 的变量,其值为 π/2。
MATLAB 包含许多内置的函数,例如 abs(计算绝对值)和 eig(计算特征值)。
>> a = sin(-5)
a =
0.9589
请注意,MATLAB 使用圆括号来传递函数输入,与标准的数学表示法类似。
任务 使用 sin 函数计算 x 的正弦值。将结果赋给一个名为 y 的变量。
任务
使用 sqrt
函数计算 -9 的平方根。将结果赋给一个名为 z
的变量。
请注意,解包含虚数 i
,这是 MATLAB 中的内置常量。
在命令行窗口中仅显示前四个小数位。您可以使用 format 函数控制显示的精度。
请试着输入 format long
并显示 x 的值。
输入 format short
可切换回默认显示。
所有 MATLAB 变量均为数组。这意味着每个变量都可以包含多个元素。您可以使用数组将相关数据存储在一个变量中。
由于您每次编程都会使用数组,因此了解数组以及用于说明数组的术语非常重要。
单个称为标量的数值实际上是一个 1×1 数组,也即它包含 1 行 1 列。
任务 创建一个名为 x 并且值为 4 的变量。
您可以使用方括号创建包含多个元素的数组。
x = [3 5]
x =
3 5
任务 创建一个名为 x 的数组,其中包含两个元素:7 和 9
当您用空格(或逗号)分隔数值时(如前面的任务中所示),MATLAB 会将这些数值组合为一个行向量,行向量是一个包含一行多列的数组 (1×n)。当您用分号分隔数值时,MATLAB 会创建一个列向量 (n×1)。
x = [1;3]
x =
1
3
任务 创建一个名为 x 的数组,其中包含两个元素 7 和 9,且两个元素位于同一列中。
试着复制以前的命令,并将数值之间的空格改为分号 (
;
)。
您可以组合使用空格和分号来创建一个矩阵,即包含多行多列的数组。输入矩阵时,您必须逐行输入它们。
x = [3 4 5;6 7 8]
x =
3 4 5
6 7 8
任务 创建一个名为 x 的矩阵,其中包含的值如下所示。 5 6 7 8 9 10
在 MATLAB 中,您可以在方括号内执行计算。
x = [abs(-4) 4^2]
x =
4 16
任务 创建一个名为 x 的行向量,其中第一个元素为 sqrt(10),第二个元素为 pi^2 (π2)。
对于长向量,输入单个数值是不实际的。可用来创建等间距向量的替代便捷方法是使用 : 运算符并仅指定起始值和最终值。
y = 5:8
y =
5 6 7 8
请注意,当您使用冒号运算符时,不需要方括号。
任务 创建一个名为 x 的行向量(包含值 1、2、3 和 4),但这次使用 : 运算符。
:
运算符:
运算符使用默认的间距 1,但是您可以指定您自己的间距,如下所示。
x = 20:2:26
x =
20 22 24 26
任务 创建一个名为 x 的行向量,该向量以 1 开头,以 5 结尾,每个元素的间距为 0.5。
如果您知道向量中所需的元素数目(而不是每个元素之间的间距),则可以改用 linspace 函数:
linspace(first,last,number_of_elements)
注意,请使用逗号 (,) 分隔 linspace 函数的输入。
x = linspace(0,1,5)
x =
0 0.250 0.500 0.750 1.000
任务 创建一个名为 x 的行向量,该向量以 1 开头,以 10 结尾,共包含 5 个元素。
linspace 和 : 运算符都可创建行向量。但是,您可以使用转置运算符 (') 将行向量转换为列向量。
x = 1:3;
x = x'
x =
1
2
3
任务 使用转置运算符将 x 从行向量转置为列向量。
您可以通过在一条命令中创建行向量并将其全部转置来创建列向量。注意此处使用圆括号来指定运算的顺序。
x = (1:2:5)'
x =
1
3
5
任务 在一条命令中,创建一个名为 x 的列向量,该向量以 5 开头,以 9 结尾,并且元素之间的间隔为 2。
MATLAB 包含许多函数,可帮助您创建常用的矩阵,例如随机数矩阵。
x = rand(2)
x =
0.8147 0.1270
0.9058 0.9134
请注意,rand(2) 命令中的 2 指定输出将为一个 2×2 的随机数矩阵。
任务 创建一个名为 x 的变量,该变量是一个 5×5 的随机数矩阵。
许多矩阵创建函数允许您输入一个数值来创建方阵 (n×n),或者输入两个数值来创建非方阵。
x = rand(2)
x =
0.8147 0.1270
0.9058 0.9134
x = rand(2,3)
x =
0.6324 0.2785 0.9575
0.0975 0.5469 0.9649
任务 使用 rand 创建一个包含 5 行 1 列的数组。将结果赋给名为 x 的变量。
任务 使用 zeros 函数创建一个包含 6 行 3 列 (6×3) 的全零矩阵。将结果赋给名为 x 的变量。
x = zeros(6,3)
如何知道现有矩阵的大小?您可以使用 size 函数。
size(x)
您也可以使用一行代码创建与现有矩阵大小相同的矩阵。
rand(size(x))
x(3) = 1
您可以使用行、列索引从数组中提取值。
y = A(5,7)
此语法将会提取 A 的第 5 行第 7 列的值,然后将结果赋给变量 y。
任务 创建一个名为 x 的变量,其值为变量 data 中位于第 6 行第 3 列的值。
您可以使用 MATLAB 关键字 end 作为行或列索引来引用最后一个元素。
y = A(end,2)
任务 使用 end 关键字获取变量 data 的最后一行第三列的值。将该值赋给一个名为 x 的变量。
请注意,您可以将算术运算与关键字 end 结合使用。例如:
y = A(end-1,end-2)
任务 创建标量变量 x,其值为 data 的倒数第二 (end-1) 行第三列的值。
如果只对一个矩阵使用一种索引,它将按顺序从上到下遍历每列。试着用一种索引提取 data 的第八个元素。
您也可以使用变量作为索引。试着创建一个变量 y,并用 y 作为 data 的索引。
用作索引时,冒号运算符 (:)
可指代该维度中的所有元素。以下语法
x = A(2,:)
会创建一个包含 A 中第 2 行上所有元素的行向量。
任务
创建一个名为 density 的变量,其中包含名为 data 的矩阵中第 2 列上的所有元素。
冒号运算符可以引用某个值范围。以下语法会创建一个包含矩阵 A 的第 1 行、第 2 行和第 3 行所有元素的矩阵。
x = A(1:3,:)
任务 创建一个名为 volumes 的变量,其中包含 data 的最后两列的所有元素。
答案
volumes = data(:,end-1:end)
单个索引值可用于引用向量元素。例如
x = v(3)
会返回向量 v 的第 3 个元素(当 v 为行向量或列向量时)。
任务 使用单个索引值创建一个名为 p 并且包含向量 density 中的第 6 个元素的变量。
单个索引值范围可用于引用向量元素的子集。例如
x = v(3:end)
返回向量 v 的一个子集,其中包含从第三个到最后一个元素范围内的所有元素。
任务 使用索引值范围创建一个名为 p 的向量,其中包含从 density 的第 2 个到第 5 个元素范围内的所有元素。
记住您可以使用 : 字符来提取整列数据。
任务 创建一个名为 v2 并且包含 data 的最后一列元素的向量。
v2 = data(:,end)
可以结合使用索引和赋值来修改变量的元素。
A(2) = 11
任务 将 v2 中的第一个元素从 NaN 更改为 0.5。
任务 将 data 的第一行和最后一列中元素的值更改为 0.5。
data(1,end) = 0.5
您可以结合使用索引与赋值,将数组值更改为与其他元素相等。例如,以下代码将 x(1) 的值更改为 x(2) 的值:
x(1) = x(2)
尝试将 data 的第一列更改为 data 的第二列。
data(:,1) = data(:,2)
MATLAB 的设计让您能够自然地处理数组。例如,您可以将一个标量值与数组中的所有元素相加。
y = x + 2
任务 将 1 与 v1 的每个元素相加,然后将结果存储在名为 r 的变量中。
您可以将任意两个大小相同的数组相加。
z = x + y
任务 创建一个向量 vs,它是向量 v1 和 v2 的和。
您可以将数组中的所有元素与某个标量相乘或相除。
z = 2*x
y = x/3
任务 创建一个变量 va,其值为 vs/2(平均体积)。
MATLAB 中的基本统计函数可应用于某个向量以生成单个输出。可以使用 max 函数来确定向量的最大值。
xMax = max(x)
任务 创建一个变量 vm,其值为 va 向量的最大值。
MATLAB 的函数可在单个命令中对整个向量或值数组执行数学运算。
xSqrt = sqrt(x)
任务 使用 round 函数创建一个名为 vr 的变量,其中包含四舍五入为整数的平均体积 va。
四舍五入
*
运算符执行矩阵乘法。因此,如果您使用 *
将两个大小相同的向量相乘,则由于内部维度不一致,您将会收到一条错误消息。
z = [3 4] * [10 20]
错误使用 *
用于矩阵乘法的维度不正确。
而 .*
运算符执行按元素乘法,允许您将两个大小相同的数组的对应元素相乘。
z = [3 4] .* [10 20]
z =
30 80
size 函数可以应用于数组,以生成包含数组大小的单个输出变量。
s = size(x)
任务 创建一个名为 dsize 的变量,其值为 data 变量的大小。
size 函数可以应用于矩阵,以生成单个输出变量或两个输出变量。使用方括号 ([ ]) 获得多个输出。
[xrow,xcol] = size(x)
任务 创建变量 dr 和 dc,其中分别包含变量 data 的行数和列数。
可以使用 max 函数确定向量的最大值及其对应的索引值。max 函数的第一个输出为输入向量的最大值。执行带两个输出的调用时,第二个输出为索引值。
[xMax,idx] = max(x)
任务 创建变量 vMax 和 ivMax,其中分别包含 v2 向量的最大值和对应的索引值。
https://ww2.mathworks.cn/help/matlab/ref/randi.html
可以使用 plot 函数在一张图上绘制两个相同长度的向量。
plot(x,y)
任务
创建一个绘图,其中 sample 位于 x 轴,mass1 位于 y 轴。
plot 函数接受一个附加参数。使用该参数,您可以通过在引号中包含不同符号的方式来指定与之对应的颜色、线型和标记样式。
plot(x,y,"r--o")
以上命令将会绘制一条红色 ® 虚线 (–),并使用圆圈 (o) 作为标记。您可以在线条设定的文档中了解有关可用符号的详细信息。
任务 绘制 mass2(y 轴)对 sample(x 轴)的图。在绘图中使用红色 ® 星号 (*) 标记,并且不使用线条。
请注意,每个绘图命令都创建了一个单独的绘图。要在一张图上先后绘制两条线,请使用 hold on 命令保留之前的绘图,然后添加另一条线。
任务
输入 hold on 命令。
然后绘制 mass1(y 轴)对 sample(x 轴)的图,并带有黑色 (k) 方形 (s) 标记,不带线条。
启用保留状态时,将继续在同一坐标区上绘图。要恢复默认绘图行为,即其中每个绘图都有自己的坐标区,请输入 hold off。
任务
输入 hold off 命令。
当您单独绘制一个向量时,MATLAB 会使用向量值作为 y 轴数据,并将 x 轴数据的范围设置为从 1 到 n(向量中的元素数目)。
任务 使用以下命令绘制向量 v1。 plot(v1)
plot 函数接受可选的附加输入,这些输入由一个属性名称和一个关联的值组成。
plot(y,“LineWidth”,5)
以上命令将绘制一条粗线。您可以在线条属性文档中了解更多可用属性的详细信息。
任务
绘制 v1,线宽为 3。
使用 plot 函数时,您可在绘图参数和线条设定符之后添加属性名称-属性值对组。
plot(x,y,“ro-”,“LineWidth”,5)
任务
绘制 v1(y 轴)对 sample(x 轴)的图,使用红色 ® 圆圈 (o) 标记,线宽为 4。
可以使用绘图注释函数(例如 title)在绘图中添加标签。此类函数的输入是一个字符串。MATLAB 中的字符串是用双引号 (") 引起来的。
title(“Plot Title”)
任务
为现有绘图添加标题 “Sample Mass”。
任务
使用 ylabel 函数添加标签 “Mass (g)”。
在此项目中,您将绘制各经济部门的用电量图 - 居民用电、商业用电和工业用电。您认为哪个经济部门的用电量将是最大的?
图中的数据为美国各年度七月份的用电量。用电量以 109 kWh/天为单位,价格以美分/kWh 为单位。
音频信号通常由许多不同的频率组成。例如,在音乐中,音符“中央 C”的基率为 261.6 Hz,并且大多数音乐都包含多个同时演奏的音符(或频率)。
在此项目中,您将分析风琴演奏 C 和弦的频谱。
C 和弦由 C (261.6 Hz)、E (329.6 Hz) 和 G (392.0 Hz) 音符组成。此频率图中突出显示的点对应于每个音符。
在绘图中,请注意 y 是周期性的,但它不是简单的正弦波。它由具有不同频率的多个正弦波组成。
傅里叶变换将返回信号的频谱信息。主频的位置将显示和弦中包含的音符。
您可以使用 fft 函数来计算向量的离散傅里叶变换。
fft(y)
fft 的输出值为复数。您可以使用 abs 函数来获得幅值。
任务
创建一个名为 yfft 的变量,表示 y 的离散傅里叶变换的绝对值。
向量 f 现在包含 n 个点。要将这些点转换为频率,您可以将整个向量乘以采样频率 (fs),然后除以点数 (n)。
f 将包含从 0 到 fs 的频率。主频位于 f 的开头位置。您可以使用 xlim 函数放大所关注的区域。
xlim([xmin xmax])
任务
将 f 乘以 fs/n。将输出赋给同一个变量 f。
使用 x 的限值 0 和 1000 绘制 yfft 对 f 的图。
要提取表变量,可以使用圆点表示法:
data.VariableName
任务
将 elements.Density 的内容赋给名为 d 的列向量。
如果您正在使用表,您可能希望将相关数据放在一起。您可以将计算结果赋给表,而不是创建单独的变量。
data.HeightMeters = data.HeightYards*0.9144
如果变量 data.HeightMeters 不存在,MATLAB 将在表中创建名为 HeightMeters 的新变量。
任务 将 elements.Density 的每个元素与 elements.Volume1 相乘。请使用 .*。
将结果赋给 elements.Mass。
您可以通过在实时脚本的输出窗格中点击表来与表进行交互。例如,您可以使用表的一个变量对表进行排序。
任务 按从最小到最大质量对表进行排序。然后更新脚本中的代码,再点击提交。
圆点表示法用于提取表变量。要提取行,可以使用常规数组索引。
尝试提取表的前三行:
top3 = elements(1:3,:)
请注意,top3 也是一个表。
关系运算符(例如 >、<、== 和 ~=)执行两个值之间的比较。相等或不相等比较的结果为 1 (true) 或 0 (false)。
任务 使用关系运算符 < 测试 π 是否小于 4。将输出赋给一个名为 test 的变量。
您可以使用关系运算符将某个向量或矩阵与单个标量值进行比较。结果是与原始数组相同大小的逻辑数组。
[5 10 15] > 12
ans =
0 0 1
任务 测试向量 v1 中是否有小于 4 的元素。将输出赋给一个名为 test 的变量。
您可以使用逻辑数组作为数组索引,在这种情况下,MATLAB 会提取索引为 true 的数组元素。以下示例将会提取 v1 中大于 6 的所有元素。
v = v1(v1 > 6)
v =
6.6678
9.0698
任务 创建一个名为 v 的变量,其中包含 v1 中所有小于 4 的元素。
您也可以对两个不同向量使用逻辑索引。
v = sample(v1 > 6)
s =
18
23
任务 创建一个名为 s 的变量,其中包含 sample 中与 v1 中小于 4 的元素所在位置对应的元素。
您可以使用逻辑索引在数组中重新赋值。例如,如果您要将数组 x 中等于 999 的所有值都替换为值 1,请使用以下语法。
x(x==999) = 1
任务 修改 v1,将其中任何小于 4 的值都替换为 0。
您可以使用逻辑运算符 and (&) 以及 or (|) 来组合逻辑比较。
要查找小于 4 且大于 2 的值,请使用 &:
x = v1(v1<4 & v1>2)
要查找大于 6 或小于 2 的值,请使用 |:
x = v1(v1>6 | v1<2)
试着获取 sample 中介于 10 和 20 之间的值。
任务 修改脚本,使第 4-7 行的绘图代码仅在 doPlot 为 1 时执行。
通常,您可能还希望在所设条件不成立时执行其他代码。为此,您可以使用 else 关键字,如下所示。
x = rand
if x > 0.5
y = 3
else
y = 4
end
任务 修改脚本,以便在 if 条件得不到满足时,执行以下代码行: disp("The density of " + element …
+ " is " + density)
elseif 关键字可在 if 后使用,以添加更多条件。您可以包括多个 elseif 代码块。
试着添加一个变量 doDisplay,用它来切换是否显示密度。使用 elseif 代码块添加此条件。
运行以下代码时,循环体将被执行三次,因为循环计数器 © 通过 1:3(1、2 和 3)进行计数。
任务 将实时脚本第二节(第 4-7 行)中的代码放在一个循环中,以便代码执行 7 次。
将您的循环计数器命名为 idx。首次执行循环时,idx 的值应为 1,并且每次迭代时递增 1。
您注意到绘图的动画效果了吗?代码 pause(0.2) 在 0.2 秒处停止循环,以便绘图进行更新。请尝试通过增大值 0.2 来增加动画时间。
该循环执行 7 次,因为 density 向量有七个元素。如果您要对未知长度的向量执行循环,可以改用 length 函数:
for idx = 1:length(density)
lambdaEnd = lambdaStart + (nObs -1) * lambdaDelta
lambda = [lambdaStart:lambdaDelta:lambdaEnd]'
使用 loglog 函数(用法同 plot 函数),在每个坐标轴上使用对数刻度绘制数据。
loglog(x,y,"*--")
任务 将光谱 (s) 作为波长 (lambda) 的函数进行绘图,在两个坐标轴上使用对数刻度。使用点标记 (.) 并用实线 (-)
连接各点。在绘图中添加 x 标签 “Wavelength” 和 y 标签 “Intensity”。
loglog(lambda,s,".-")
xlabel("Wavelength")
ylabel("Intensity")
min 函数可以带有两个输出,其中第二个输出为最小值的索引。该索引与氢-α 谱线的位置对应。
任务 创建两个变量 sHa 和 idx,分别表示 s 的最小值和最小值的位置索引。
使用 idx 对 lambda 进行索引以找到氢-α 谱线的波长。将结果存储为 lambdaHa (λ Ha )。
[sHa,idx] = min(s)
lambdaHa = lambda(idx)
线 (lambdaHa,sHa) 是氢-α 谱线的位置。
任务
将 x = lambdaHa、y = sHa 处的点绘制成一个标记大小 ("MarkerSize") 为 8 的红色方框 ("rs"),添加到现有图中。
hold on
loglog(lambdaHa,sHa,"rs","MarkerSize",8)
hold off
在上一个项目中,您确定了一颗恒星的频谱是否发生了红移或蓝移,并计算了该恒星相对于地球的速度。在此项目中,您将同时计算所有恒星的速度。然后您将创建以下绘图。
for c = 1:7
s = spectra(:,c)
if speed(c)<=0
loglog(lambda,s,"--")
else
loglog(lambda,s,".-","LineWidth",3)
end
hold on
end
hold off
您可以将字符串数组直接传递给 legend 函数。
字符串数组 starnames 包含 spectra 中每颗恒星的名称。
任务
使用数组 starnames 向绘图中添加图例。
legend (starnames )
https://blog.csdn.net/lxyoucan/article/details/127802456
摘自:
https://www.bilibili.com/video/BV13D4y1Q7RS/?p=9&spm_id_from=pageDriver&vd_source=3b8afcc2613780d7607382bae034945a
t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
xlabel('sin(t)')
ylabel('cos(t)')
zlabel('t')
grid on
axis square