Matlab语法
索引(Indexing)与修改数组
如果只对一个矩阵使用一种索引,它将按顺序从上到下遍历每列。
load datafile
data
y=data(8) %索引矩阵data的第八个元素。
冒号运算符可以引用某个值范围。
x = A(1:3,:) %创建一个包含矩阵 A 的第 1 行、第 2 行和第 3 行所有元素的矩阵。
索引可以是非连续数字。
density=[1;2;3;4;5;6;7;8]
z=[1 3 6]
p=density(z) %提取 density 的第一个、第三个和第六个元素。
可以结合使用索引和赋值来修改变量的元素。
v2(1)=0.5 %将 v2 中的第一个元素从 NaN 更改为 0.5。
数组计算
MATLAB 的函数可在单个命令中对整个向量或值数组执行数学运算。
load datafile
density = data(:,2);
v1 = data(:,3);
v2 = data(:,4);
一个标量和一个数组运算
r=v1+1 %将一个标量值与数组中的所有元素相加。
va=vs/2 %将一个标量值与数组中的所有元素相加。
两个相同大小的数组运算
vs=v1+v2 %将任意两个大小相同的数组相加。
vm=max(va) %将一个标量值与数组中的所有元素相加。
vn=sqrt(va) %将数组中的所有元素求平方根,赋给新数组。
vr=round(va) %将数组中的所有元素四舍五入为整数,赋给新数组。
使用 * 运算符执行矩阵乘法。
使用 .* 运算符执行按元素乘法。 将两个大小相同的数组的对应元素相乘。
使用.^运算符执行元素平方。
兼容大小的数组运算
ans=[1 2;3 4;5 6;7 8].*[1;2;3;4]
ans= 1 2
6 8
15 18
28 32
调用函数
size 函数可以应用于矩阵,以生成单个输出变量或两个输出变量。使用方括号 ([ ]) 获得多个输出。
[xrow,xcol] = size(x) %返回数组x的尺寸
y=numel(x) %返回数组x的元素数目
可以使用 max 函数确定向量的最大值及其对应的索引值。max 函数的第一个输出为输入向量的最大值。执行带两个输出的调用时,第二个输出为索引值。
[xMax,idx] = max(x)
如果只需函数的第二个输出,可以使用波浪号字符 (~) 忽略特定输出。
[~,idx] = max(x)
绘制数据图
plot 函数接受一个附加参数。使用该参数,您可以通过在引号中包含不同符号的方式来指定与之对应的颜色、线型和标记样式。
启用保留状态(hold on)时,将继续在同一坐标区上绘图。
要恢复默认绘图行为,即其中每个绘图都有自己的坐标区,请输入 hold off。
plot(x,y,"r--o") %绘制一条红色 (r) 虚线 (--),并使用圆圈 (o) 作为标记。
hold on %保留之前的绘图,然后添加另一条线。
plot(sample,mass1,"ks")
hold off %恢复默认绘图行为,即每个绘图都有自己的坐标区。否则默认开启hold on。
当单独绘制一个向量时,MATLAB 会使用向量值作为 y 轴数据,并将 x 轴数据的范围设置为从 1 到 n(向量中的元素数目)。
plot(v1)
plot 函数接受可选的附加输入,这些输入由一个属性名称和一个关联的值组成。
plot(v1,"LineWidth",3) %绘制一条线宽为5的线条。
使用 plot 函数时,可在绘图参数和线条设定符之后添加属性名称-属性值对组。
plot(sample,v1,"ro","LineWidth",4) %使用红色 (r) 圆圈 (o) 标记,线宽为 4。 **顺序不能改**
histogram(density,"facecolor","y") %创建直方图。将 "FaceColor" 设置为黄色 ("y")
使用 loglog 函数(用法同 plot 函数),在每个坐标轴上使用对数刻度绘制数据。
loglog(x,y,".-") %将y作为x的函数进行绘图,在两个坐标轴上使用对数刻度。使用点标记 (.) 并用实线 (-) 连接各点。
hold on
loglog(1,2,"rs","MarkerSize",8) %将 x = 1、y = 2 处的点绘制成一个标记大小 ("MarkerSize") 为 8 的红色方框 ("rs"),添加到现有图中。
绘图注释
可以使用绘图注释函数(例如 title)在绘图中添加标签。此类函数的输入是一个字符串。MATLAB 中的字符串是用双引号 (") 引起来的。
使用 title 函数为绘图添加标签。
使用 ylabel 函数添加标签 “Mass (g)”。
使用 legend 函数为绘图添加图例。
title("Sample Mass")
ylabel("Mass(g)")
legend("Exp A","Exp B")
bar(data(3,:))
title("Sample " + sample(3) + " Data")
Case:分析风琴演奏 C 和弦的频谱。
C 和弦由 C (261.6 Hz)、E (329.6 Hz) 和 G (392.0 Hz) 音符组成。此频率图中突出显示的点对应于每个音符。
C 和弦录音存储在一个名为 Cchord.mat 的文件中。此文件包含两个变量:
y:录音信号;fs:采样频率
load Cchord
n = numel(y)
t = 0:n-1
t = t/fs %t 需要表示音频信号的采样时间。可以使用采样频率 fs 将向量转换为时间(以秒为单位)。
plot(t,y)
yfft = abs(fft(y)) %使用 fft 函数来计算向量的离散傅里叶变换。fft 的输出值为复数,使用 abs 函数来获得幅值。
f = 0:n-1 %需要为 FFT 向量 yfft 计算频率向量 f。
f = f*fs/n %向量 f 现在包含 n 个点。要将这些点转换为频率,可以将整个向量乘以采样频率 fs,然后除以点数 n。
plot(f,yfft)
xlim([0 1000]) %f 将包含从 0 到 fs 的频率。主频位于 f 的开头位置。使用 xlim 函数放大所关注的区域。
前三个峰值是构成中央 C 和弦的音符。图中的 6 个峰值对应于中央 C 和弦的基频和第一个谐波。
导入数据
要提取表变量,可以使用圆点表示法:data.VariableName
如果正在使用表,并希望将相关数据放在一起。可以将计算结果赋给表,而不是创建单独的变量。
data.HeightMeters = data.HeightYards*0.9144
如果变量 data.HeightMeters 不存在,MATLAB 将在表中创建名为 HeightMeters 的新变量。
您可以通过在实时脚本的输出窗格中点击表来与表进行交互。例如,您可以使用表的一个变量对表进行排序。在您对表感到满意时,您可以通过更新代码使更改永久化。
圆点表示法用于提取表变量。要提取行,可以使用常规数组索引。
load datafile
elements
d = elements.Density %将 elements.Density 的内容赋给名为 d 的列向量。
elements.Mass=elements.Density.*elements.Volume1 %M=D.*V
elements = sortrows(elements, "Mass") %按从最小到最大质量对表进行排序。然后更新脚本中的代码。
top3=elements(1:3,:) %提取表的前三行,此时top3也是一个表。
逻辑数组
关系运算符(例如 >、<、== 和 ~=)执行两个值之间的比较。相等或不相等比较的结果为 1 (true) 或 0 (false)。
可以使用关系运算符将某个向量或矩阵与单个标量值进行比较。结果是与原始数组相同大小的逻辑数组。
v1=[5 10 15]
v1 > 12
ans =
0 0 1
可以使用逻辑数组作为数组索引,在这种情况下,MATLAB 会提取索引为 true 的数组元素。以下示例将会提取 v1 中大于 6 的所有元素。
v = v1(v1 > 6)
v =
6.6678
9.0698
也可以对两个不同向量使用逻辑索引。MATLAB 会提取v2中索引为 true 的数组元素
v = v2(v1 > 6)
v =
18
23
可以使用逻辑索引在数组中重新赋值。e.g.将数组 x 中等于 999 的所有值都替换为值 1:
x(x==999) = 1
总结