导入Excel文件为mat文件

把数据复制到工作区,并将这个矩阵命名为X:

(1)在工作区右键,点击新建(Ctrl+N),输入变量名称为X

(2)在Excel中复制数据,再回到Matlab中右键,点击粘贴Excel数据(Ctrl+Shift+V)

(3)关掉这个窗口,点击X变量,右键另存为mat文件(下次就不用复制粘贴了,只需使用load命令即可加载数据)

 (4)注意,代码和 .mat文件要放在同一个目录下,且Matlab的当前文件夹也要是这个目录。

 (5)加载数据:在代码前加入 load 方法 

load data.mat

作图

画一个矩形边框:

axis([0,pi, 0,a/2]);   
box on;  
% 画一个坐标轴的框架,x轴位于0-pi,y轴位于0-a/2, 并打开图形的边框
% 画出来是一个矩形

plot(phi(i), x(i), 'r.') 
hold on;

% 设置横纵坐标的范围并标上字符
x = 1:0.01:3;
y = x .^ 2;
plot(x,y)  % 画出x和y的图形
pause(3)  % 暂停3秒后再继续接下来的命令
text(2,4,'我')  % 在坐标为(2,4)的点上标上字符串:我
close % 关闭图形窗口

三维图

mesh 网格图

X = [1,2,4]
Y = [3,5]
Z = [4,8,10;
     5,9,13]
mesh(X,Y,Z)  
% 反过来了!!!(X(j), Y(i), Z(i,j))是线框网格线的交点的坐标
% (1 3 4) (2 3 8) (2 5 9) (1 5 5)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

hidden off  % 可以看到背部的图像,不会遮挡(默认是看不到的)

alpha(0.8)  % 设置透明度为0.8,这时候隐隐约约能看到(透明度介于0-1之间,越大表示越透明)

n = 11;
tem = linspace(0,5,n);  % 将[0,5]这个区间等分为n个点(等差数列的形式)

axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

%% meshc函数:除了mesh函数图形外,还在xy平面上绘制曲面的等高线
meshc(x,y,z)

%% meshz函数:除了mesh函数图形外,还在xy平面上绘制曲面的底座
meshz(x,y,z)

surf 曲面图

[x,y] = meshgrid(linspace(0,5,11));
% [x,y] = meshgrid([0:0.5:5]);  
% 或者直接写成[x,y] = meshgrid(0:0.5:5);

subplot(1,2,1)  % subplot(m,n,index)

title('mesh(x,y,z)')

%% surfc函数:除了surf函数图形外,还在xy平面上绘制曲面的等高线
surfc(x,y,z)

%% surfl函数:加上了灯光效果,看起来自然点
surfl(x,y,z)

%% 设置色彩模式
% shading 是用来处理色彩效果的,分以下三种:
shading faceted % 是默认的模式 
shading flat % 在faceted的基础上去掉图上的网格线
shading interp % 在flat的基础上进行色彩的插值处理,使色彩平滑过渡

contour 等高线图 

%% contour函数: 绘制等高线图

% 在x-y平面绘制等高线图,Matlab会自动选择等高线的层级
contour(x,y,z)

 
% n是一个标量,Matlab会将等高线的层数设置为n,且会自动选择层所在的高度。
contour(x,y,z,10)
contour(x,y,z,5,'LineWidth',2)    % 设置线的宽度为2
contour(x,y,z,5,'--')             % 设置等高线为虚线
contour(x,y,z,5,'ShowText','on')  % 显示每一层的高度
contour(x,y,z,5,'--','ShowText','on','LineWidth',2)  % 可以组合起来使用
colorbar                          % 显示颜色栏,也可以手动插入


%% 得到固定的n个高度的等高线,将levels设置为n元行向量,其中向量中的值为高度值。
maxz = max(max(z))
minz = min(min(z))
levels = linspace(minz,maxz,10)  % 从最小值到最大值,等分成10个点 

contour(x,y,z,levels,'ShowText','on','LineWidth',1)  
% 最小值或者最大值可能显示不出来,因为Matlab会帮我们自动调整


% 只想画出高度为0的单等高线怎么办?
contour(x,y,z,[0 0],'ShowText','on') 


%% contourf函数:和contour函数类似,只不过画出来的等高线图有颜色填充
contourf(x,y,z,levels,'ShowText','on') 


%% contour3函数:3维等高线图,等高线不再投影到x-y平面
contour3(x,y,z,levels,'ShowText','on')

符号函数

%% plot3函数 
% t = 0: 0.1: 4*pi;   
% 符号是t,t从0变动到4pi,间隔设置为0.1
t = linspace(0,4*pi,100);  
% 符号是t,t从0变动到4pi,等分为100个点
x = sin(t)+1; % 利用t计算x的值
y = cos(t);  % 利用t计算y的值
z = t; % 利用t计算z的值
plot3(x,y,z,'r--') 


%% fplot3函数
syms t  % 符号是t
x = sin(t)+1;
y = cos(t); 
z = t;
fplot3(x,y,z) % 默认t的变化范围为[-5 5]
fplot3(x,y,z,[0 4*pi]) % 修改t的变化范围为0至4pi


%% fmesh 三维网格图
syms x y 
z=x^2+y^2;
fmesh(z)             % 默认x的变化范围和y的变化范围都是[-5 5]
fmesh(z,[-2 2 -4 4]) % 修改x的变化范围和y的变化范围分别为[-2 2]和[-4 4]
axis vis3d           % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
axis equal           % 设置屏幕高宽比,使得每个坐标轴的具有均匀的刻度间隔
fmesh(z,[-2 2 -4 4],'MeshDensity',11)   % 设置每个方向计算的点数


%% fsurf 三维曲面图 用法同fmesh


%% fcontour 绘制等高线
syms x y 
z=x^2+y^2;
fcontour(z)             % 默认x的变化范围和y的变化范围都是[-5 5]
fcontour(z,[-2 2 -4 4]) % 修改x的变化范围和y的变化范围分别为[-2 2]和[-4 4]
fcontour(z,'fill','on') % 在等高线线条间进行填充

隐函数

%% 在默认区间 [-5 5]上绘制 f(x,y,z) = 0 定义的三维隐函数
f = @(x,y,z) x.^2 + y.^2 - z.^2;  % 函数句柄 这里要注意,要用点运算符
fimplicit3(f)

interval = [-5 5 -5 5 0 5];   % 指定范围
fimplicit3(f,interval)

fimplicit3(f,interval,'EdgeColor', 'none', 'FaceAlpha',0.5)  % 去掉边缘颜色,调整透明度

符号运算

% 符号矩阵
syms alpha
M = [cos(alpha)  -sin(alpha);
       sin(alpha)  cos(alpha)]

%% 简单运算
syms a b c d e

y = a + b
% a + b

x = c - d
% c - d

y1 = x*y
% (a + b)*(c - d)

y2 = y1/y
% c - d

y3 = y1^3
% (a + b)^3*(c - d)^3

y4 = sqrt(y3)   
% ((a + b)^3*(c - d)^3)^(1/2)

y5 = exp(y4)
% exp(((a + b)^3*(c - d)^3)^(1/2))
% 化简
syms a
y=(cot(a/2)-tan(a/2))*(1+tan(a)*tan(a/2))
simplify(y)
% 2/sin(a)


%% 因式分解
factor(12) % 对常数进行因式分解 
%      2     2     3
syms m n x
y = -24*m^2*x-16*n^2*x
factor(y)
% [ -8, x, 3*m^2 + 2*n^2]


%% 多项式展开
syms a x
y = a*(x^2-a)^2+(x-2)
expand(y)
% a^3 - 2*a^2*x^2 + a*x^4 + x - 2


%% 合并
syms x y
z = (x+y)^2*y+5*y*x-2*x^3
collect(z,x)
% y*x^2 - 2*x^3 + (2*y^2 + 5*y)*x + y^3
collect(z,y)
% y^3 + 2*x*y^2 + (x^2 + 5*x)*y - 2*x^3

%% 计算分子与分母
% [z1,z2] = numden(2.5)  % 会报错,因为numden的输入变量不能是数值,只能是符号变量
% ans = sym(2.5);  % sym函数可以将数值2.5转换为符号
[z1,z2] = numden(sym(2.5)) % 对常数计算分子与分母
% z1 = 5
% z2 = 2
syms x y
z = 1/x*y+x/(x^2-2*y)
[z1,z2] = numden(z)  %z1分子,z2分母
% z1 = - x^2*y - x^2 + 2*y^2
% z2 = x*(- x^2 + 2*y)

求导

% 一元函数的导数
syms x
y = x^4-5*x^2+6
diff(y) %求一阶导数
% 4*x^3 - 10*x
diff(y,2) %求二阶导数
% 12*x^2 - 10


% 多元函数的导数
syms x1 x2 x3
y1 = x1^5*x2+x2*x3-x1^2*x3
py1 = diff(y1,x1,1) % 对x1求一阶偏导
% 5*x2*x1^4 - 2*x3*x1
py2 = diff(y1,x1,2) % 对x1求二阶偏导
% 20*x2*x1^3 - 2*x3
py3 = diff(y1,x1,x2) % 先对x1求偏导,再对x2求偏导
% 5*x1^4


%% 注意,如果diff函数作用的对象不是符号函数,而是矩阵,那么对应的功能是求差分。
A=[4 5 6 3 2 1];
diff(A)  % 求向量A的一阶差分     1     1    -3    -1    -1
diff(A,2)  % 在一阶差分的基础上再差分一次     0    -4     2     0

A=[4 5 6; 
     7 4 2;
     5 6 2]

A1=diff(A)  % 下一行减去上一行求一阶差分
%      3    -1    -4
%     -2     2     0

A2=diff(A,2) % 下一行减去上一行求二阶差分(在一阶差分的基础上再差分一次)
%     -5     3     4

A3=diff(A,2,1) % 最后面的1表示在行上进行差分(在列的方向上进行差分)
%     -5     3     4

A4=diff(A,1,2)  % 后一列减去前一列求一阶差分, 最后面的2表示在列上进行差分(在行的方向上进行差分)
%      1     1
%     -3    -2
%      1    -4

A4=diff(A,2,2) % 后一列减去前一列求二阶差分
%      0
%      1
%     -5

不定积分、定积分

%% 不定积分(求导数的原函数)
syms x
y = x^2
int(y,x)
% x^3/3 


%% 定积分
syms x
y = sin(x)
int(y,x,0,pi/2) % 上下界
% 1 

y = (sin(x))^2 / x^2
b=int(y,x,0,+inf)


% 在数学分析中,给定函数的定积分的计算不总是可行的,许多定积分不能用已知的积分公式得到精确值。
% 所以用数值积分:用于求定积分的近似值
y = @(x) 1 ./ exp(x) .* log(x+2.*x.^2+sin(x))  % 注意,写成函数句柄时,要用点乘或者点除
integral(y,0,4)

求解方程和方程组

syms u v a
eqn = [2*u + v == a, u - v == 1];
answ = solve(eqn, [u, v])
answ.u
answ.v
[answ_u, answ_v] = solve(eqn, [u, v])

生成随机数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 输出在[a,b]之间均匀分布的随机数组成的m行n列的矩阵
unifrnd(a,b,m,n)
% 等价于:
a + rand(m,n)*(b-a)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 产生由在[0,1]之间均匀分布的随机数组成的m行n列的矩阵
rand(m,n)
% 方阵
rand(3)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
randi([1,5],5,8)  %在区间[1,5]内随机取出大小为5*8的整数矩阵
randi([1,5])      %在区间[1,5]内随机取出1个整数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
normrnd(10,2)  % 均值为10 标准差为2(方差为4)的正态分布随机数
% exprnd(M)表示生成一个均值为M的指数分布随机数(其对应的参数为1/M)
exprnd(5)  % 均值为5的指数分布随机数(对应的参数为0.2)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
randperm(5)  % 生成1-5组成的一个随机序列(类似于洗牌的操作)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以一定的概率产生随机数  randsrc(m,n,[alphabet; prob])
% m和n表示生成的随机数矩阵的行数和列数
% alphabet表示需要产生的随机数的数字,用一个行向量表示
% prob表示这些数字出现的概率大小,用一个行向量表示,向量长度和alphabet向量要完全相同, 且这些概率的和要为1
% 比如:要产生1、4、 6这三个数。它们分别出现的概率为 0.1、0.2、0.7,如何设计程序使得按照这个概率产生10个随机数呢?
alphabet = [1 4 6]; prob = [0.1 0.2 0.7];
randsrc(10,1,[alphabet; prob])

概率统计计算

%% 第一步:对数据x标准化为X
X=zscore(x);   % matlab内置的标准化函数(x-mean(x))/std(x)

%% 第二步:计算样本协方差矩阵
R = cov(X);

%% 注意:以上两步可合并为下面一步:直接计算样本相关系数矩阵
R = corrcoef(x);
disp('样本相关系数矩阵为:')
disp(R)

%% 第三步:计算R的特征值和特征向量
% 注意:R是半正定矩阵,所以其特征值不为负数
% R同时是对称矩阵,Matlab计算对称矩阵时,会将特征值按照从小到大排列
[V,D] = eig(R);  % V 特征向量矩阵  D 特征值构成的对角矩阵

cum_contribution_rate = cumsum(lambda)/ sum(lambda);   % 主成分分析中计算累计贡献率  cumsum是求累加值的函数