> 文章列表 > MatLab (Matrix Laboratory) 入门笔记

MatLab (Matrix Laboratory) 入门笔记

MatLab (Matrix Laboratory) 入门笔记

视频教程: https://matlabacademy.mathworks.com/

######## MatLab (Matrix Laboratory) 入门笔记 ########

基础命令:

save datafile # 保存为datafile.mat文件
clear # 函数清理工作区
load datafile # 加载datafile.mat文件
data # 变量名显示值
clc # 清空命令行
load datafile m # 从文件datafile.mat中仅加载变量m
save xx m # 将变量m保存到名为xx.mat的新MAT文件中
x = pi # 内置的常量pi表示π
y = sin(x) #
z = sqrt(-9) # 解包含虚数 i
format long # 控制显示的精度
x # 显示控制精度后的值
x; # 有末尾分号时 命令行不显示结果

脚本:
r = 2
x = pi * r^2 # Section Break: Alt + Command + 回车

向量矩阵:
手动输入数组
所有MATLAB变量均为数组 这意味着每个变量都可以包含多个元素 可以使用数组将相关数据存储在一个变量中
单个称为标量的数值实际上是一个1×1数组 也即它包含1行1列
x = [7 9] 或 [7,9] 或 [7, 9] # 当用空格(或逗号)分隔数值时 MATLAB会将这些数值组合为一个行向量 行向量是一个包含一行多列的数组(1×n)
x = [7;9] # 当用分号分隔数值时 MATLAB会创建一个列向量(n×1)
x = [5,6,7;8 9 10] # 可以组合使用空格(或逗号)和分号来创建一个矩阵 即包含多行多列的数组 输入矩阵时 必须逐行输入它们
x = [sqrt(10), pi^2] # 可以在方括号内执行计算
创建等间距向量
y = [5 6 7 8] # 包含等间距数值的向量
y = 5:8 # 同上 长向量 使用:运算符并仅指定起始值和最终值
y = 20:2:26 # 指定间距为2
y = linspace(1,10,5) # 线性等分向量(linear space) linspace(first,last,number_of_elements)
y = y’ # 转置运算符’将行向量 转换为 列向量
x = (1:2:5)’ # 注意此处使用圆括号来指定运算的顺序
数组创建函数
x = rand(5) # 生成5*5随机数矩阵 创建方阵
x = rand(5,1) # 5行1列的数组 创建非方阵
x = zeros(6,3) # 6行3列(6×3)全零矩阵
y = size(x) # 矩阵的大小
y = rand(size(x)) # 创建与现有矩阵大小相同的矩阵

索引和修改数组:
x = y(6,3) # 获取数组y中第6行第3列的值
x = y(end,3) # 获取数组y中最后一行第3列的值
x = y(end-1,3) # 获取数组y中倒数第二行第3列的值
x = A(2,:) # 用作索引时 冒号运算符:可指代该维度中所有元素
x = A(1:3,:) # 矩阵A中第1-3行所有元素
x = A(:,end-1:end) # 矩阵A中最后两列所有元素
x = v(3) # 返回向量v第3个元素(当v为行向量或列向量时)
x = v(3:end) # 向量元素的子集
x = v([2,4,5]) # 索引非连续 第2,4,5元素
x(1) = 7 #
x(1,end) = 7 # 使用索引赋值
x; # 注意有分号 命令行不显示结果
tp = x(:,2)
x(:,2) = x(:,1)
x(:,1) = tp # 交换第一二列

数组计算:
v1 = data(:,3);
v2 = data(:,4);
r = v1 + 1 # 1与每个元素相加(同理乘/除法)
z = v1 + v2 # 每个对应元素相加
m = max(v1) # 最大值
rd = round(v1) # 每个元素四舍五入
x = v1.*v2 # .运算符执行按元素乘法 将两个大小相同的数组的对应元素相乘
x = [1 2;3 4;5 6;7 8].
[1;2;3;4] # 对其他具有兼容大小的数组执行运算

调用函数:
x = size(data) # size函数可以应用于矩阵
[r,c] = size(data) # 可同时赋值给变量r和c
r = x(1,1) # 获取行数(另一种获取方式)
c = x(1,2) # 获取列数
[m,i] = max(v2) # max函数确定向量的最大值及其对应的索引值
v1 = data(:,2)
[~,i] = max(v1) # 波浪号字符~忽略特定输出
m = v1(i) # 根据索引 获取最大值

获取帮助:
doc randi # 打开文档
x = randi([1,20],[5,7]) # 1-20伪随机整数 5行7列矩阵
x = randi(20,5) # 1-20伪随机整数 5*5矩阵
x = randi(20) # 1-20伪随机整数

绘制数据图:
x = data(:,3);
y = data(:,4);
plot(x,y) # 绘制 2-D line plot
plot(x,y,“r–o”) # 附加参数 红色® 虚线(–) 使用圆圈(o)作为标记
hold on # 启用保留状态 保留之前的绘图 然后添加另一条线
plot(sample,mass1,“ks”) # 黑色(k) 方形(s)标记 不带线条
hold off # 关闭保留状态
plot(v1) # 使用向量值作为y轴数据 并将x轴数据的范围设置为从1到n (向量中的元素数目)
plot(y,“LineWidth”,5) # 可选的附加输入 这些输入由一个属性名称和一个关联的值组成
plot(x,y,“ro-”,“LineWidth”,5) # 可在绘图参数和线条设定符之后 添加属性名称-属性值对组
图库: https://www.mathworks.com/products/matlab/plot-gallery.html
histogram(v1,“FaceColor”,“y”) # 绘制黄色直方图
title(“Plot标题”) # 绘图注释函数 注意使用"
ylabel(“Y轴标签(g)”)
legend(“a”,“b”,“c”) # 添加图例 (右上角 符号对应)
bar(data(3,:)) # 绘图
title(“XX “+ v1(3) +” XX”) # 标题内容拼接
x = 1:1:10
y = 2.^x
plot(x,y,“r–*”) # 绘制一个简单函数图

练习-用电量:
load electricity.mat # 加载文件
usage # 查看数据
usage(2,3) = 2.74 # 修正错误数据
res = usage(:,1)
comm = usage(:,2)
ind = usage(:,3) # 三个向量提取数据
yrs = (1991:2013)’ # 自定义年份向量
hold on # 启用保留状态
plot(yrs,res,“b–”) # 蓝色(b) 虚线(–)
plot(yrs,comm,“k:”) # 黑色(k) 点线(😃
plot(yrs,ind, “m-.”) # 洋红色(m) 点划线(-.)
title(“July Electricity Usage”) # 标题
legend(“res”,“comm”,“ind”,“Location”,“northwest”) # 图例
练习-音频频率:
load Cchord.mat
y
fs
n = numel(y)
t = 0:(n-1)
t = t/fs
plot(t,y)
yfft = abs(fft(y)) # fft函数计算向量的离散傅里叶变换
f = 0:(n-1)
f = f*fs/n
plot(f,yfft)
xlim([0,1000]) # 放大所关注的区域 xlim([min max])

导入数据:
load datafile
elements # 导入表数据对象
c = elements.c1 # 提取表变量 圆点表示法 data.VariableName 赋值给列向量c
elements.newC = elements.c1 .* elements.c2 # 创建新列 并赋值
elements = sortrows(elements, “c1”, “descend”) # 按c1列降序排列
elements = sortrows(elements, “c1”) # 按c1列升序排列(默认升序)
top3 = elements(1:3,:) # 获取前三行所有数据

逻辑数组:
b = pi < 4 # 关系运算符 > < == ~= 表示比较
t = v1 < 4 # 结果是与原始数组相同大小的逻辑数组
v = v1(v1 < 4) # 提取索引为true的数组元素
s = v2(v1 < 4) # v2与v1中小于4的元素所在位置对应的元素
v1(v1 < 4) = 0 # 所有符合条件值都替换为0
x = v1(v1<4 & v1>2) # 逻辑运算符 & | 组合比较
x = v1(v1>6 | v1<2)

编程-决策分支:
doPlot = randi([0 1]) # 生成一个0或1的伪随机整数
load datafile
density = data(:,1);
if doPlot
plot(density)
title(“Sample Densities”)
xticklabels(element) #
ylabel(“Density (g/cm^3)”)
elseif doDisplay
disp("The density of " + element + " is " + density)
else
disp(“其它”)
end
编程-for循环:
load datafile
density = data(:,1);
for idx = 1:length(density)
hold on
plot(idx,density(idx),‘*’)
hold off
pause(0.5)
end

综合练习-恒星运动1:
load starData
nObs = size(spectra,1)
lambdaStart = 630.02
lambdaDelta = 0.14
spectra
lambdaEnd = lambdaStart + (nObs - 1)lambdaDelta
lambda = (lambdaStart:lambdaDelta:lambdaEnd)’ # 列向量
s = spectra(:,2)
% doc loglog # 对数刻度绘制
loglog(lambda,s, “.-”)
xlabel(“Wavelength”)
ylabel(“Intensity”)
[sHa, idx] = min(s)
lambdaHa = lambda(idx)
hold on
loglog(lambdaHa,sHa,“rs”,“MarkerSize”,8)
hold off
z = lambdaHa/656.28 - 1 # 计算红移量(恒星相对于地球的速度)
speed = z
299792.458
综合练习-恒星运动2:
[sHa,idx] = min(spectra) # min(spectra(:,2))
lambdaHa = lambda(idx)
z = lambdaHa/656.28 - 1
speed = z*299792.458
for c = 1:7
s = spectra(:,c)
if speed© <= 0
loglog(lambda,s,“–”)
else
loglog(lambda,s,“LineWidth”,3)
end
hold on
end
hold off
legend(starnames) # 图例
movaway = starnames(speed>0) # 提取速度>0的名称