- 参考
- 说明
- 变量
- 格式化输入输出
- 条件
- 循环
- 函数
- 文件读写
- 数学
- 绘图
- 文件读写
- 有趣
- 统计分析
- other
为了水学分,选了一个matlab的课,把常用的命令记录下来,方便做作业
参考
Matlab中disp、fprintf和sprintf有什么区别?
说明
- 可以在终端直接执行,命令后以
;
结尾不会输出到屏幕,也可以使用m文件 - 同行书写,用
;
代表换行 - 变量名区分大小写,字母数字下划线
- 变量无需定义,随用随赋值,新创建,赋值为新数据=删除旧变量并重新定义赋值
- 注释
%开头
,多行注释??
,m文件开头的注释,help 文件名
时,会显示文件开头的注释,函数文件function
行后面的注释会在help 函数名
后显示 - 代码节用
%%
和空格开头,可用于单独调试某一段代码 - 函数(变量)也可函数(矩阵),返回一组值
- 函数,默认传址调用,单独书写成一个文件,文件名和函数名一样
- 所有变量默认
double
类型 !
开头执行系统命令[矩阵]'
单引号表示转置
path路径
设置path(搜索路径)path(path1,'new_path',path2)
,等价于bash的PATH=PATH1:$PATH:PATH2
输入命令后,matlab的搜索方式
- (1)检查该命令是不是一个变量。
- (2)检查该命令是不是一个内部函数。
- (3)检查该命令是否当前目录下的M文件。
- (4)检查该命令是否MATLAB搜索路径中其他目录下的M文件。
标点符号
辅助命令
help lookfor tab模糊查询
clc
类似于linux的clear
清空界面
clf
清空图形
clear 清空变量
clear x y z %清除x,y,z 中间是空格不是,
clear %清楚所有变量
save 保存变量
save 文件名 [变量名表,空格分隔,不是,] [-append] [-ascii]
变量名不指定,保存所有变量
保存文件默认为xxx.mat 文件名无需写mat
-append
追加变量,已存在相同变量名则覆盖
-ascii
选项使文件以ASCII格式处理,省略该选项时文件将以二进制格式处理
load 导入变量
save 文件名 [变量名表,空格分隔,不是,]
全导入或导入指定变量
who 查看是否存在变量
who [变量表]
whos 查看变量信息
whos [变量表]
》whos
Name Size Bytes Class Attributes
a 1x3 24 double
b 1x1 8 double
显示精度
默认是双精度存储计算,只显示format形式,更改显示形式
变量
数值
数值类型
在未加说明与特殊定义时,MATLAB对所有数值按照双精度浮点数类型进行存储和操作
复数y=complex(a,b)
或`y=a+b*i)
单精度浮点类型不能与整数类型进行算术运算
变量
系统变量
不能清除
i, j:虚数单位。
inf:无穷大。
realmax:最大正实数。
realmin:最小正实数。
ans:没有给定变量值,系统默认采用ans。
eps:可作为一个容许误差。如eps=2^(-42)。
NaN:表示不定值。由Inf/Inf或者0/0得到。
nargin:函数输入参数个数。
nargout:函数输出的参数个数
lasterr:存放最新的错误信息
lastwar:存放最新的警告信息
矩阵
定义
,
或空格分开同行元素,;
分开行,也可将其他矩阵用于元素构造新矩阵
》x=[1,2,3;4,5,6;7,8,9]
x =
1 2 3
4 5 6
7 8 9
调用、赋值A(m,n)
- A([a,b,c],[d,e]) 操作/提取A矩阵的a,b,c行,d,e列元素
- A(end,end)最后一个元素
- A(-2,-2)倒数第2行,倒数第2列
- A(:,m:n) 逗号两边是维度,一个
:
表示所有行,m:n
表示m到n列 - A(n) 按列存储,第n个元素,与Fortran一样
- A([一维数列]) 操作/提取一维数列n对应A(n)元素
- A(范围)=[] 删除矩阵元素,维度变化
- A(范围)=0 赋值0
- 若,原矩阵该范围内之前不存在元素,操作后,自动拓展矩阵,未指定元素赋0,即
- 使用条件提取特定值,如若
ResponseTime{Condition}{1}矩阵元==one
,即被试编号是one,则提取被试相应的数据
` OneResponseTime{Condition}=ResponseTime{Condition}{2}(ResponseTime{Condition}{1}==one);
x =
1 2
3 4
》x(3,3)=1
x =
1 2 0
3 4 0
0 0 1 ```
矩阵生成
等差,等比数列
等差数列[按差值]start[:差值]:end
差值默认为1
》x=1:0.2:2
x =
1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
》x=1:2
x =
1 2
等差数列[按总点数],linspace(start,end[,总点数])
总点数默认100
》linspace(1,2,5)
ans =
1.0000 1.2500 1.5000 1.7500 2.0000
等比数列,an=a0*x^n
,logspace(start,end[,总点数])
点数默认50
logspace(1,2,5)
ans =
10.0000 17.7828 31.6228 56.2341 100.0000
》17.7828/10*17.7828
ans =
31.6228
特殊矩阵
一下的N或m,n或m,n,p也可用size(A)已存在矩阵来替代
ones(N) NxN全1矩阵
ones(m,n) mxn全1矩阵
ones(m,n,p) mxnxp 全1
ones(size(A)) 与A维度相同,全1
zeros(N) 全0
zeros(m,n) 全0
zeros(m,n,p) 全0
rand(N) 0-1随机数
rand(m,n) 0-1随机数
rand(m,n,p) 0-1随机数
randn(维度):产生符合均值为0,方差为1的标准正态分布
eye(N) NxN单位矩阵
eye(m,n) mxn对角线1
对角线矩阵
x =
1 2 3
》diag(x,0) %或diag(x)
ans =
1 0 0
0 2 0
0 0 3
》diag(x,1)
ans =
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
》diag(x,-1)
ans =
0 0 0 0
1 0 0 0
0 2 0 0
0 0 3 0
稀疏矩阵
A=sparse(S)将矩阵S转化为稀疏存储方式的矩阵A,当矩阵S是稀疏存储方式时,则函数调用相当于A=S;
A=sparse(m,n):生成一个m*n的所有元素都是0的稀疏矩阵A。
A=sparse(u,v,S): u,v,S是3个等长的向量。S是要建立的稀疏矩阵的非0元素,u(i)、v(i)分别是S(i)的行和列下标,该函数建立一个max(u)行、max(v)列并以S为稀疏元素的稀疏矩阵。
S=sparse(i,j,s,m,n):其中i 和j 分别是矩阵非零元素的行和列指标向量,s是非零元素值向量,m,n 分别是矩阵的行数和列数
》A
A =
1 2 0 0
0 0 3 4
0 0 0 0
》S=sparse(A)
S =
(1,1) 1
(1,2) 2
(2,3) 3
(2,4) 4
%S的存储方式和一般矩阵不同
%恢复一般存储方式
S+0或full(S)
magic魔方矩阵,magic(n)
对于n阶魔方阵,其元素由1,2,3,…,nn共nn个整数组成
范得蒙矩阵vander(a)
范得蒙(Vandermonde)矩阵是指最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积,即 a的斐波那契次方构成
》a=[1 2 3 4 5];
》vander(a)
ans =
1 1 1 1 1
16 8 4 2 1
81 27 9 3 1
256 64 16 4 1
625 125 25 5 1
希尔伯特矩阵
hill(n) %n阶希尔伯特矩阵
invhill(n) %n阶希尔伯特矩阵的逆
托普利兹矩阵
托普利兹(Toeplitz)矩阵 除第一行第一列外,其他每个元素都与左上角的元素相同。生成托普利兹矩阵的函数是toeplitz(x,y),它生成一个以向量x为第一列,以向量y为第一行的托普利兹矩阵。toeplitz(x)用向量x生成一个对称的托普利兹矩阵
x,y向量,第一个元素需相同
》x=[1 2 3 4];
》y=[1 20 30];
》toeplitz(x,y)
ans =
1 20 30
2 1 20
3 2 1
4 3 2
矩阵函数
- size(x)查看矩阵x维度,返回维度数组
》a a = 1 2 3 》h=size(a) h = 1 3
-
length(x)返回就是size(x)的第二个维度大小,即一维矩阵长度,mxn二维矩阵的n
- reshape(x,维度) 按照新维度排列矩阵,不改变x,如
A(3,2)=1;B=resphape(A,1,6)
下三角矩阵tril(A[,k]),上三角矩阵triu(A[,k])
a =
1 1 1
1 1 1
1 1 1
》tril(a)
ans =
1 0 0
1 1 0
1 1 1
》triu(a,1)
ans =
0 1 1
0 0 1
0 0 0
转置:x.'
非共轭转置,x'
共轭转置
翻转 :fliplr(x)
左右翻转, flipud(x)
上下翻转,flipdim(x,dim)
按维度翻转
旋转
B=rot90(A)
:矩阵B是矩阵A沿逆时针方向旋转90度得到的。
B=rot90(A,k)
:矩阵B是矩阵A沿逆时针方向旋转k*90
度得到的(要想顺时针旋转,k取-1)
逆 inv(x)
伪逆是对于不可逆矩阵来说的。对于可逆矩阵来说,伪逆和逆结果一样,对于不可能逆矩阵,是采用最小二乘的方法求一个近似的逆
可逆:方阵+满秩
如果矩阵A不是一个方阵,或者A是一个非满秩的方阵时,矩阵A没有逆矩阵,但可以找到一个与A的转置矩阵A’同型的矩阵B,使得:ABA=A,BAB=B 此时称矩阵B为矩阵A的伪逆,也称为广义逆矩阵。在MATLAB中,求一个矩阵伪逆的函数是pinv(A)。当一个矩阵不是满秩的时候,如果要求逆,只能用伪逆函数来求。
行列式det(x)
迹trace(x)
对角线元素之和
秩rank(x)
特征值,特征向量
Ax=ax 特征值an,特征向量xn
eig(A) 特征值
[a,x]=eig(A) 特征值a,特征向量x
范数
了解了范数再来弹
norm
字符串'字符串'
与"string型"
字符串 ,字符char型构成的数组,用单引号'
》a='string';
》whos a
Name Size Bytes Class Attributes
a 1x6 12 char
使用cd
切换目录时,只能cd '目录'
很多命令/函数的输入都用'字符数组'
%将变量a保存到file文件
save ('file','a')
%将xi保存到
save (['data',num2str(i)],['x',num2str(i)])
关于num2str可以按照格式转成字符串
num2str(T,'%2.1f\n')]
string型,用双引号"
》a="tring";
》whos a
Name Size Bytes Class Attributes
a 1x1 158 string
函数略
结构体
定义
直接定义
》xiaoming.matrix=[1:10];
》xiaoming.grad=123;
》xiaoming
xiaoming =
包含以下字段的 struct:
matrix: [1 2 3 4 5 6 7 8 9 10]
grad: 123
struct创建,可以同时创建n个student(n)
但只有第n个会被赋值
》student(2)=struct('matrix',[1:10],'grad',123);
》student(1)
ans =
包含以下字段的 struct:
matrix: []
grad: []
》student(2)
ans =
包含以下字段的 struct:
matrix: [1 2 3 4 5 6 7 8 9 10]
grad: 123
使用repmat
创建复制内容相同的结构体
》student=repmat(struct('matrix',[1:10],'grad',123),2,3);
》student
student =
包含以下字段的 2×3 struct 数组:
matrix
grad
》student(1,3)
ans =
包含以下字段的 struct:
matrix: [1 2 3 4 5 6 7 8 9 10]
grad: 123
使用
cell
定义
a={元素}
使用
cell的维度也可以是多维
a{m,n}
cell里面有cell
a{m,n}{p,q}
格式化输入输出
格式化输出
disp(‘字符数组’)直接显示在命令行
disp(['6.全体学生IQ和GPA的相关系数为:', num2str(IQCorr(1,2))])
sprintf和fprintf都用来生成格式化的字符串,当然也可以直接接受没有格式的字符串 Sprintf是s(tring)print f(ormat),也就是直接生成带格式的字符串的,通常并不直接用来显示在命令行
Fprintf是f(ile)printf(ormat),可以用来直接进行文件的写入,如果不指定文件的fid那么直接输出到命令行
error('错误信息')
提示错误信息,并终止程序
warning('错误信息')
提示错误信息,继续运行
条件
if-else-end
if 条件
命令
elseif 条件
命令
else
命令
end
elseif else
可不写
if a==5; b=5;end
swith
switch num %num可以是变量,表达式,但结果要是标量或字符向量
case value1
命令
case value2
命令
otherwise
命令
end
otherwise
可以忽略
try-catch 捕获运行是否发生错误
try
命令1
catch
命令2
end
如果命令1执行报错,程序运行错误,执行命令2
比如提取矩阵超过范围,执行语句不存在
循环
for
for x=array
命令
end
可以中途改变x的取值,不影响运行
while
while 条件
命令
end
循环调节
continue
进入下一个循环
break
终止循环
函数
函数传址调用
自定义函数function
一个函数写一个文件,函数名和文件名一致
help 函数名
会返回函数体之前的注释
function [输出变量]=函数名(输入变量)
%注释行start
%。。。help 函数名时,会显示这部分注释
%注释行end
函数体
end
使用return
可以提前返回,跳出函数
可以缺省输入,输出
也可以在m文件中定义function,本文件内调用
文件读写
数学
基础计算
+(加)、-(减)、*(乘)、^(乘方)、’(转置)
对于矩阵a,ba/b(a除以b)、a\b(a被b除)
eye(size(x))/x == inv(x)
A\B等效于inv(A)*B
B/A等效于B*inv(A)
对于标量a,b a/b==b\a
.*
点乘,元素相乘,.\
` ./ 点除,元素相除,
.^`点乘方
逻辑关系
关系成立返回1,否则0,可以比较变量和矩阵
<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)
矩阵逻辑返回矩阵
&(与)、|(或)和~(非) 可以判断矩阵
A&&B 不支持判断矩阵,首先判断A的逻辑值,如果A的值为假,就可以判断整个表达式的值为假,就不需要再判断B的值
"|"与“||”同理
逻辑函数
find(x非0) x中大于1的元素位置
find(x>1) x>1的矩阵中非0元素,即x中大于1的元素位置
数学函数
假如x为向量,则表示对向量中的每个元素进行操作后得到的新向量
abs(x)绝对值
sqrt(x)开方
sign(x)符号函数,返回0,1,-1
exp(x):e^x
log(x):ln(x)
log2(x)
log10(x)
pow2(n)==2^n
real(x) 实部
image(x) 虚部
取整
round(x):四舍五入,与他距离最近的整数
fix(x):只保留整数部分
floor(x):向负无穷取整
ceil(x):向正无穷取整
取余
求x除以y的余数,Fortran中是mod(y,x)
rem(x,y)
返回的是x-n.*y,其中的n = fix(x./y),fix舍去小数部分,向0取整
mod(x,y):
命令返回的是x-n.*y,n=floor(x./y),向负无穷取整
当x和y的正负号一样的时候,两个函数结果是等同的 当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样
指数函数
exp(n)=e^2
5^2=5x5
对数
log(x):求x以e为底的对数,即自然对数。如果x为向量,则对其中的每个元素都求自然对数。
log2(x):求x以2为底的对数。如果x为向量,则对其中的每个元素都求以2为底的对数。
log10(x):求x以10为底的对数。如果x为向量,则对其中的每个元素都求以10为底的对数
线性方程组
求导
积分
绘图
画板操作
画板分隔subplot(x,y,z)
将绘图窗口分隔成x*y
个画板,活动画板为第z个画板(从左到右,从上到下)
切换绘图窗口 figure([n])
切换到绘图窗口n,若不存在则新建,缺省n,自动创建
关闭活动画图窗口close([n])
关闭绘图窗口n,缺省n,关闭当前活动窗口
图形操作
在本图上继续画图 hold on, 取消hold off
title标题
titlename=['T = ',num2str(T,'%2.1f\n'),'系统磁矩']
title(titlename);
legend图例
legend('y=sin(x)','y=cos(x)')
legend('y=sin(x)','y=cos(x)','Location','位置')
%位置如下图
legendoff %清除图例
字体风格
在显示到图上时控制显示格式
title('\fontname{宋体} \bf \fontsize{20} no 字体^{上标}_{下标}\beta')
legend('\fontname{宋体} \bf \fontsize{20} no 字体^{上标}_{下标}\beta')
坐标轴
坐标轴范围
axis equal
axis([xmin xmax ymin ymax]):设置坐标轴的范围,指 定当前坐标轴x轴和y轴的范围,其中xmin为x轴下界,而 xmax为x轴的上届,而ymin和ymax分别为y轴的下界和 上界。
axis([xmin xmax ymin ymax zmin zmax]):设置x、y 和z坐标轴的范围,其中xmin和xmax为x轴下界和上届, ymin和ymax分别为y轴的下界和上界,zmin和zmax分别 为z轴的下界和上界。
xlim([xmin xmax]):仅设置x轴的范围
ylim([ymin ymax]):仅设置y轴的范围。
指定坐标轴lable
set(gca,'xtick',[1 2 3 4]); % 故意为了只是显示4个刻度值,下方的设置才有效
%设置x标签
set(gca,'xticklabel',{'字符串长度6+干扰','字符串长度9+干扰','字符串长度6+安静','字符串长度9+安静'});
%注意{ }
坐标轴log增量semilogyx, semilogy 恒纵坐标刻度是10^n
semilogy(y)
semilogy(x,y)
通过gca设置图形的参数
gca返回一个“结构体”,是当前绘图面板的所有参数的值,通过get(gca)
可以看到可以设置的参数,修改gca内部参数的值,即可修改当前图形
get(gca)
ALim: [0 1]
ALimMode: 'auto'
ActivePositionProperty: 'position'
AmbientLightColor: [1 1 1]
BeingDeleted: 'off'
Box: 'on'
BoxStyle: 'back'
BusyAction: 'queue'
ButtonDownFcn: ''
CLim: [0 1]
CLimMode: 'auto'
CameraPosition: [2 0.5706 19.6202]
CameraPositionMode: 'auto'
CameraTarget: [2 0.5706 0
%略略略略
FontName: 'Times New Roman'
FontSize: 10
%略略略略
set(gca,参数,值)
set(gca, 'FontSize',20)
保存图像
pngname=['up.',num2str(T,'%2.1f\n'),'.png'];
saveas(gcf,pngname)
坐标
#### meshgrid 绘制网格
[xx,yy]=meshgrid(x,y)
二维图
plot 直角坐标
plot(y)
plot(x,y) %x,y亦可为矩阵
plot(x,y,线形描述) %也可以画图后,用画图面板调
多维曲线
plot(x1,y1,[线形,]x2,y2,[线形,]...)
plot(X,Y) %X,Y是通维矩阵,可以是一维X,多维Y,也可以是多维X和多维Y
line 用直线连接二维三维之间的点
line(x,y) %必须有x,y,即至少两个参量,表示一个二维点,
line(x,y,z)
line(x,y,z,线形)
bar条形图
bar(y)
bar(x,y)
pir 饼图
pie(x)
hist直方图
hist(y)
hist(y,x) %直方图中心为x中的各值
scatter散点图
scatter(x,y)
polar 极坐标
polar(角度,半径)
polar(角度,半径,线形)
plotyy 两个y坐标轴标度
plotyy(x1,y1,x2,y2)
plotyy(x1,y1,x2,y2,fun) %
plotyy(x1,y1,x2,y2,fun1,fun2)
%fun可以为plot和semilogy等绘图函数,如
plotyy(x1,y1,x2,y2,@plot,@semilogy)
counter 等高线
contour(z) :把矩阵z中的值作为一个二维函数 的值,等高曲线在一个平面内,平面的高度v由 MATLAB自动选取,绘制等高线。
contour(x,y,z):(x,y)是平面z=0上点的坐标矩 阵,z为相应点的高度值矩阵,绘制等高线。
contour(z,n):画出矩阵z的n条等高线。 contour(x,y,z,n) :画出矩阵z的n条等高线。 contour(z,v) :在指定的高度v上画出等高线
clabel 添加高度标签
曲线,标记样式
plot(x,y,'style')
plot(x,sin(x),'gsquare--')
%画error bar只显示bar部分
errorbar(MeanResponse,VarResponse,'linestyle', 'none')
%线宽,点大小
plot(x,sin(x),'gsquare--','LineWidth',4,'MarkerSize',10)
文件读写
读入
按格式读入textscan
filename='RightRatio.dat';
RightRatioID = fopen(filename);
RightRatio=textscan(RightRatioID,'%d%f%f%f%f','HeaderLines',1);
%'HeaderLines',从第1+1行读取
%MATLAB文件中的行号从0开始
% %d整数%f实数
fclose(RightRatioID);
有趣
eval(字符数组),执行字符数组对应的命令
eval(['x=100'])
eval(['x','=',num2str(y)])
统计分析
p值计算
%设置统计参数
alpha = 0.05;%显著水平
tail = 'both';
vartype = 'equal';
disp('1. 语音干扰是否会显著影响被试的反应时和正确率')
[h,p,muci,stats] = ttest2(AverageResponseTime{2},AverageResponseTime{4},alpha,tail,vartype);
disp(['字符长度为6时:语音干扰与安静情况下,被试反应时的p值 p=', num2str(p)])
预测分析
%% 请对IQ&GPA.csv 中的数据进行如下分析
%clear
%=====读入数据
filename='IQ&GPA.csv';
IQData=csvread(filename, 1, 0);
%%=== 6. 请绘制全体学生IQ和GPA的散点图并计算相关系数
figure(4)
scatter(IQData(:,1),IQData(:,2),'*');
title('全体学生IQ和GPA的散点图')
xlabel('IQ (z score)');ylabel('GPA');
IQCorr=corrcoef(IQData(:,1),IQData(:,2));
disp(['6.全体学生IQ和GPA的相关系数为:', num2str(IQCorr(1,2))])
%%
disp(' ')
disp(' ')
%===7. 请回答:IQ能否预测学生的GPA。(可利用多种数据分析方法以及相关的图、表来辅证)
%此处参考[包寒吴霜-多层线性模型(HLM)及其自由度问题](https://zhuanlan.zhihu.com/p/50048784)
%
figure(5)
clf(5)
for school=1:3 %[1:3]
oneIQ=[];
oneGPA=[];
oneIQ=IQData(IQData(:,3)==school,1);
oneGPA=IQData(IQData(:,3)==school,2);
%各学校散点图
subplot(1,3,school)
scatter(oneIQ,oneGPA,'*');
titlename=['学校',num2str(school),' 学生IQ和GPA的散点图'];
title(titlename)
xlabel('IQ (z score)');ylabel('GPA');
hold on
%回归分析
%排序
[oneIQSort, id] = sort(oneIQ);
oneGPASort=oneGPA(id);%列矩阵
oneIQSort=oneIQSort;%列矩阵
xdata = [ones(size(oneIQSort)), oneIQSort];
%regress分析
b1 = regress(oneGPASort, xdata);
yhat1 = xdata*b1;
plot(oneIQSort, yhat1, 'b--','linewidth',1)
%robustfit分析
b2 = robustfit(oneIQSort,oneGPASort);
yhat2 = xdata*b2;
plot(oneIQSort, yhat2, 'linewidth', 1)
legend('原始数据','regress回归直线','robustfit回归直线')
%相关系数
oneIQCorr=corrcoef(oneIQ,oneGPA);
disp(['7.学校',num2str(school),'学生IQ和GPA的相关系数为:', num2str(oneIQCorr(1,2))])
end
other
采集数据,若是正态分布可以进行检验,
非正态分布,进行置换
本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!