下个星期要给同学们做matlab入门培训,先来博客写写练练手,熟悉一下内容。
打算分基础篇、绘图篇和进阶篇。今天先总结一下基础篇吧。
目录
界面认识
菜单栏
part1:文件和脚本管理部分
part2:数据导入部分
part3:环境变量部分(如果你新下载了一个toolbox,比如m_map,那就需要点这里的设置路径,把新的toolbox的环境变量添加进来)
part4: 帮助与教程部分
工作文件夹和工作区
显示当前目录和变量(注意绝对路径和相对路径的区别)
注意工作区、命令行窗口、编辑器都有一个向下的小箭头(小红框),可以在里面设置停靠或取消停靠。
命令行窗口
编辑器+实时编辑器
编辑器和实时编辑器的区别在于:实时编辑器能够像写文档一样,在代码间插入文本和公式。适用于完成作业或写教学脚本,格式为*.mlx;编辑器则更适合一气呵成写完一个可运行的文件,格式为*.m。
基础语法
基础桌面命令
help%查询函数基本用法
doc%查看函数文档
clc %清空命令行
clear %清除变量
close %关闭图片窗口
close all %关闭所有图片
commandhistory %查询历史命令行,可以按上下箭头查阅历史命令
help和doc的区别在于:如果你知道这个命令,但是一时忘了参数怎么用,help一下就可以;如果你不熟悉某个命令,想要仔细学习一下,可以用doc查看详细解释。
数组和矩阵运算
创建数组
a=zeros(1,5) %生成全部为0的数组,1行5列
a=ones(1,5) %生成全部为1的数组,1行5列
a=nan(1,5) %生成全部为nan的数组,1行5列
b=zeros(5) %生成全部为0的矩阵,5行5列
a=eye(5) %生成单位矩阵,5行5列
一维数组操作
x=[1 3 5 7 9 8 6 4 2];
sort(x) %数组排序
flip(x) %翻转元素顺序
transpose(x)%数组或矩阵转置
数组索引
x=[1 3 5 7 9 7 5 3 1]
x(1)
x(2)
x(3)
y=[2,3,4;5,6,7]
y(1,2) %查看第1行第2列数值
y(2,3) %查看第2行第3列数值
y(:,3) %查看第3列数值
y(2,:) %查看第1行数值
y(:,2:3) %查看所有行第2-3列数值
注意matlab中索引是从1开始的。
矩阵计算
例1:三阶线性代数方程组求解
A=[2 -5 4;3 1 2;1 -2 3]
b=[1;6;2]
x=A\b
A*x
注意矩阵相乘和矩阵元素对应相乘的区别
A=[1,2,3;4,5,6;7,8,9]
B=ones(3)
C=A*B
D=A.*B
多维数组操作
x=rand(24,31,12,2); %x的四个维度为小时,日,月,年
size(x) %x的四个维度为小时,日,月,年
y=permute(x,[1,3,2,4]); %置换数组维度
size(y) %y的四个维度为小时,月,日,年
y1=reshape(x,31*24,12,2);%重构数组, 要特别注意原数组的维度顺序,现在这个是对的,数据展开顺序是第1天的24小时,第2天的24小时,第3天的24小时……
size(y1)
x(:,1:2,1,1)
y1(1:48,1,1) %可以用前两天数据检查一下
x1=flip(x);
y2=reshape(x1,2,12,31*24);%重构数组, 现在这个是错的,并不是把一个月内的数据按时间展开了,而是31天的第一小时,31天的第二小时,31天的第三小时……
size(y2)
x1(1,1,1:2,:)
y2(1,1,1:48) %可以用前两天数据检查一下
z1=repmat(x,2,1,1,1); %重复数组副本, 第一维度复制1次
size(z1)
z2=repmat(x,1,3,1,1); %重复数组副本, 第二维度复制2次
size(z2)
m=nanmean(x,3); %对非首尾的维度进行某种运算,如求平均,对应维度长度变为1
size(m)
m1=squeeze(nanmean(x,3)); %删除数组长度为1的维度
size(m1)
循环和条件语句
if语句
x=1;
y=0;
add=0;
if add==1
x
else
y
end
while语句
x=1;
y=0;
i=1;
while i<=5
x
i=i+1;
end
for循环
x=1;
y=0;
for i=1:5
y
end
for循环和while的区别在于:
for是有限次循环,明确了循环次数;while可以是无限次循环,只要满足条件就一直循环。
就好比银行办业务,
第一种:上午9点开门营业时,一口气来了100个人,我把门一关,100个人办完下班,这是for;
第二种:上午9点开门营业,陆陆续续有人来办业务,只要顾客是在下午5点之前进门来的,我都给办理,这是while。
数据导入和存储
数据类型:int, double, string, char, cell, struct……
x=2021
help x
y1=num2str(2021) %数值转字符
help y1
size(y1)
y2=cast(x,'int32')
help y2
z=str2num(y1) %字符转数字
help z
cell2mat %元胞转矩阵
num2cell %数值转元胞
数据文件类型:.mat, .txt, .csv, .xlsx, .nc……
matlab格式化数据:.mat
clc;clear;
x=zeros(1,5)
y=ones(1,5)
save example.mat %将数据存成mat格式
save x.mat x %将某个变量存成mat格式
clear;
load example.mat %加载mat文件数据
x
y
文本文件:.txt
data=ones(2,12)
for mm=1:12
filename=['../month' num2str(mm,'%02d') '.txt'];
fileID=fopen(filename,'wt'); %写入文件
fprintf(fileID,'%10.8f\n',data(:,mm));
fclose(fileID);
end
for mm=1:12
filename=['../month' num2str(mm,'%02d') '.txt'];
fileID=fopen(filename,'r');
dat = textscan(fileID, '%f', 'HeaderLines',0); %textscan读进来的是元胞数据
data=cell2mat(dat) %元胞转数组
fclose(fileID);
end
文本文件:.csv (逗号分割文本文件,没有任何表格格式)
data=readmatrix('example.csv'); %从文件读取矩阵
data=importdata('example.csv'); %从文件加载数据
data=csvread('example.csv'); %不推荐使用
电子表格:.xlsx
data=readmatrix('example.xlsx'); %从文件读取矩阵
data=importdata('example.xlsx'); %从文件加载数据
科学数据:netCDF
lat=double(ncread('../data/2_25_latlon.nc','LAT'));%从文件读取数据,第一个参数为文件名,第二个参数为变量名
lon=double(ncread('../data/2_25_latlon.nc','LON'));
var1=lat;
var2=lon;
outfile=['example.nc']; %存储数据为nc格式
nccreate(outfile,'varname1','Dimensions',{'dim1',144,'dim2',91},'Datatype','double','Format','classic');
ncwrite(outfile,'varname1',var1);
nccreate(outfile,'varname2','Dimensions',{'dim1',144,'dim2',91},'Datatype','single','Format','classic');
ncwrite(outfile,'varname2',var2);
ncdisp(outfile);
统计分析
基本统计处理(描述性统计)
x=[1 3 5 7 9 7 5 3 1];
y1=min(x) %求取最小值
y2=max(x) %求取最大
y3=mean(x) %求取平均值
y4=median(x) %求取中位数
y5=std(x) %求取标准差
y6=sum(x) %求和
带有缺省值的数据
x=[1 NaN 5 7 9 7 5 3 1];
y1=min(x); %求取最小值
y2=max(x); %求取最大
y3=nanmean(x); %求取平均值
y4=nanmedian(x); %求取中位数
y5=nanstd(x); %求取标准差
如果这里不加nan,还和上面一样操作,那么计算平均值、中位数、标准差的结果就全都是NaN了。
基础篇就先这么多吧。虽然都是很简单的内容,但总结起来也花了很多时间呢。
自己梳理了一遍,也希望能给大家带来一点点小帮助。
下一篇讲画图。