数学建模Matlab学习

1.1分号和注释

在每一行的语句后面加上分号(一定要是英文的哦;中文的长这个样子;)表示不显示运行结果

a = 3;

a = 5

多行注释:选中要注释的若干语句,快捷键Ctrl+R

% a = 3;

% a = 5

% (3)取消注释:选中要取消注释的语句,快捷键Ctrl+T

% 我想要取消注释下面这行

% 还有这一行

1.2clear和clc清除

% clear可以清楚工作区的所有变量

clear

% clc可以清除命令行窗口中的所有文本,让屏幕变得干净

clc

% 所以大家在很多代码开头,都会见到:

clear;clc   % 分号也用于区分行。

% 这两条一起使用,起到“初始化”的作用,防止之前的结果对新脚本文件(后缀名是 .m)产生干扰。

 1.3输入输出函数

%% 输出和输入函数(disp 和 input)

% disp函数

% matlab中disp()就是屏幕输出函数,类似于c语言中的printf()函数

disp('我是清风,大家好鸭~~~记得投币关注我哦')

a = [1,2,3]    %同一行中间用逗号分隔,也可以不用逗号,直接用空格

a = [1 2 3]

disp(a)

% 注意,disp函数比较特殊,这里可要分号,可不要分号哦

disp(a);

% input函数

% 一般我们会将输入的数、向量、矩阵、字符串等赋给一个变量,这里我们赋给A

A = input('请输入A:');

B = input('请输入B:')

% 注意观察工作区,并体会input后面加分号和不加分号的区别

1.4stract字符串的合并,数字转化为字符串

% matlab中两个字符串的合并有两种方法

% strcat(str1,str2……,strn)

 strcat('字符串1','字符串2')

% (2)[str 1,str 2,……, str n]或[str1  str2  ……  strn]

['字符串1'  '字符串2']

['字符串1','字符串2']

% 一个有用的字符串函数:num2str  将数字转换为字符串

c = 100

num2str(c)

disp(['c的取值为' num2str(c)])

disp(strcat('c的取值为', num2str(c)))

 1.5求和函数sum和乘积函数prod

%% sum函数

% (1)如果是向量(无论是行向量还是列向量),都是直接求和

E = [1,2,3]

sum(E)

E = [1;2;3]

sum(E)

% (2)如果是矩阵,则需要根据行和列的方向作区分

clc

E = [1,2;3,4;5,6]

% a=sum(x); %按列求和(得到一个行向量)

a = sum(E)

a = sum(E,1)

% a=sum(x,2); %按行求和(得到一个列向量)

a = sum(E,2)

% a=sum(x(:));%对整个矩阵求和

a = sum(sum(E))

a = sum(E(:))

B = prod(A)

将A矩阵不同维的元素的乘积返回到矩阵B。

Matlab中文论坛

如果A是向量,prod(A)返回A向量的乘积。

如果A是矩阵,prod(A)将A看作列向量,返回每一列元素的乘积并组成一个行向量B。

如果A是多维数组,prod(A)沿着第一个非单例作为向量,返回一个行向量数组。 《Simulink与信号处理》

B = prod(A,dim)

沿着指定的dim标量的维计算A矩阵的乘积。注:dim=2表示沿行计算。

注明:该例子来自Mathworks公司英文帮助文件。

已知矩阵A: 《Simulink与信号处理》

M = magic(3)

M =

      8 1 6

      3 5 7

      4 9 2

例一:计算矩阵A的每一列元素的乘积

prod(M) =

              96 45 84

例二:计算矩阵A每一行元素的乘积, dim=2表示按行计算

prod(M,2) =

                  48

                  105

                  72

1.6寻找函数find

%% find函数的基本用法

% 下面例子来自博客:https://www.cnblogs.com/anzhiwu815/p/5907033.html 博客内有更加深入的探究

% find函数,它可以用来返回向量或者矩阵中不为0的元素的位置索引。

clc;X = [1 0 4 -3 0 0 0 8 6]

ind = find(X)

% 其有多种用法,比如返回前2个不为0的元素的位置:

ind = find(X,2)

%上面针对的是向量(一维),若X是一个矩阵(二维,有行和列),索引该如何返回呢?

clc;X = [1 -3 0;0 0 8;4 0 6]

ind = find(X)

% 这是因为在Matlab在存储矩阵时,是一列一列存储的,我们可以做一下验证:

X(4)

% 假如你需要按照行列的信息输出该怎么办呢?

[r,c] = find(X)

[r,c] = find(X,1) %只找第一个非0元素

% Matlab的判断语句,if所在的行不需要冒号,语句的最后一定要以end结尾 ;中间的语句要注意缩进。

a = input('请输入考试分数:')

if a >= 85  

    disp('成绩优秀')

elseif a >= 60

    disp('成绩合格')

else

    disp('成绩挂科')

end

1.7 function 函数的使用

% function [输出变量] = 函数名称(输入变量)  

% 函数的中间部分都是函数体

% 函数的最后要用end结尾

% 输出变量和输入变量可以有多个,用逗号隔开

% function [a,b,c]=test(d,e,f)

%     a=d+e;

%     b=e+f;

%     c=f+d;

% end

% 自定义的函数要单独放在一个m文件中,不可以直接放在主函数里面(和其他大多数语言不同)

1.8 sort 函数的排序

% sort(A)若A是向量不管是列还是行向量,默认都是对A进行升序排列。sort(A)是默认的升序,而sort(A,'descend')是降序排序。

% sort(A)若A是矩阵,默认对A的各列进行升序排列

% sort(A,dim)

% dim=1时等效sort(A)

% dim=2时表示对A中的各行元素升序排列

% A = [2,1,3,8]

% Matlab中给一维向量排序是使用sort函数:sort(A),排序是按升序进行的,其中A为待排序的向量;

% 若欲保留排列前的索引,则可用 [sA,index] = sort(A,'descend') ,排序后,sA是排序好的向量,index是向量sA中对A的索引。

% sA  =  8     3     2     1

% index =  4     3     1     2

1.9匿名函数

% 匿名函数的基本用法。

% handle = @(arglist) anonymous_function

% 其中handle为调用匿名函数时使用的名字。

% arglist为匿名函数的输入参数,可以是一个,也可以是多个,用逗号分隔。

% anonymous_function为匿名函数的表达式。

% 举个小例子

%  z=@(x,y) x^2+y^2;

%  z(1,2)

% % ans =  5

% fplot函数可用于画出匿名一元函数的图形。

% fplot(f,xinterval) 将匿名函数f在指定区间xinterval绘图。xinterval =  [xmin xmax] 表示定义域的范围

1.10随机数的产生

% (1)randi : 产生均匀分布的随机整数(i = int)  

%产生一个1至10之间的随机整数矩阵,大小为2x5;

s1 = randi(10,2,5)

%产生一个-5至5之间的随机整数矩阵,大小为1x10;

s2 = randi([-5,5],1,10)

%  (2) rand: 产生0至1之间均匀分布的随机数

%产生一个0至1之间的随机矩阵,大小为1x5;

s3 = rand(1,5)

%产生一个a至b之间的随机矩阵,大小为1x5;  % a + (b-a) * rand(1,5); 如:a,b = 2,5

s4= 2 + (5-2) * rand(1,5)

% (3)normrnd:产生正态分布的随机数

%产生一个均值为0,标准差(方差开根号)为2的正态分布的随机矩阵,大小为3x4;

s5 = normrnd(0,2,3,4)

% (4)roundn—任意位置四舍五入

% 0个位 1十位  2百位 -1小数点后一位  

a = 3.1415

roundn(a,-2)    % ans   =  3.1400

roundn(a,2)      % ans   =  0

a =31415

roundn(a,2)   % ans  = 31400

roundn(5.5,0)  %6

roundn(5.5,1) %10

  1.  矩阵相关知识

2.1矩阵元素的提取

%% 基础:matlab中如何提取矩阵中指定位置的元素?

% (1)取指定行和列的一个元素(输出的是一个值)

clc;A=[1 1 4 1/3 3;1 1 4 1/3 3;1/4 1/4 1 1/3 1/2;3 3 3 1 3;1/3 1/3 2 1/3 1];

A

A(2,1)

A(3,2)

% (2)取指定的某一行的全部元素(输出的是一个行向量)

clc;A

A(2,:)

A(5,:)

% (3)取指定的某一列的全部元素(输出的是一个列向量)

clc;A

A(:,1)

A(:,3)

% (4)取指定的某些行的全部元素(输出的是一个矩阵)

clc;A

A([2,5],:)      % 只取第二行和第五行(一共2行)

A(2:5,:)        % 取第二行到第五行(一共4行)

A(2:2:5,:)     % 取第二行和第四行 (从2开始,每次递增2个单位,到5结束)

1:3:10

10:-1:1

A(2:end,:)      % 取第二行到最后一行

A(2:end-1,:)    % 取第二行到倒数第二行

% (5)取全部元素(按列拼接的,最终输出的是一个列向量)

clc;A

A(:)

2.2矩阵大小函数size

%% size函数

clc;

A = [1,2,3;4,5,6]

B = [1,2,3,4,5,6]

size(A)

size(B)

% size(A)函数是用来求矩阵A的大小的,它返回一个行向量,第一个元素是矩阵的行数,第二个元素是矩阵的列数

[r,c] = size(A)

% 将矩阵A的行数返回到第一个变量r,将矩阵的列数返回到第二个变量c

r = size(A,1)  %返回行数

c = size(A,2) %返回列数

 2.3矩阵的复制函数repmat

%% repmat函数

% B = repmat(A,m,n):将矩阵A复制m×n块,即把A作为B的元素,B由m×n个A平铺而成。

A = [1,2,3;4,5,6]

B = repmat(A,2,1)

B = repmat(A,3,2)

 2.4矩阵的运算

%% Matlab中矩阵的运算

% MATLAB在矩阵的运算中,“*”号和“/”号代表矩阵之间的乘法与除法(A/B = A*inv(B))

A = [1,2;3,4]

B = [1,0;1,1]

A * B

inv(B)  % 求B的逆矩阵

B * inv(B)

A * inv(B)

A / B

% 两个形状相同的矩阵对应元素之间的乘除法需要使用“.*”和“./”

A = [1,2;3,4]

B = [1,0;1,1]

A .* B

A ./ B

% 每个元素同时和常数相乘或相除操作都可以使用

A = [1,2;3,4]

A * 2

A .* 2

A / 2

A ./ 2

% 每个元素同时乘方时只能用 .^

A = [1,2;3,4]

A .^ 2

A ^ 2

A * A

 2.5 矩阵求特征值和特征向量

%% Matlab中求特征值和特征向量

% 在Matlab中,计算矩阵A的特征值和特征向量的函数是eig(A),其中最常用的两个用法:

A = [1 2 3 ;2 2 1;2 0 3]

% (1)E=eig(A):求矩阵A的全部特征值,构成向量E。

E=eig(A)

% (2)[V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。(V的每一列都是D中与之相同列的特征值的特征向量)

[V,D]=eig(A)

2.6矩阵与常数的大小判断运算

% 共有三种运算符:大于> ;小于< ;等于 ==  (一个等号表示赋值;两个等号表示判断)

clc

X = [1 -3 0;0 0 8;4 0 6]

X > 0

X == 4

  1. 画图方法

3.1plot折线图

% plot函数用法:

% plot(x1,y1,x2,y2)

% 线方式: - 实线 :点线 -. 虚点线 - - 波折线

% 点方式: . 圆点  +加号  * 星号  x x形  o 小圆

% 颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青

plot([-2.048,-2.048],[0,tpdf(-2.048,28)],'r-')

plot([2.048,2.048],[0,tpdf(2.048,28)],'r-')

plot画直线段

3.2 figure用于图编号

figure(1); % 在同一个脚本文件里面,要想画多个图,需要给每个图编号,否则只会显示最后一个图哦~

3.3legend显示图标

% LEGEND(string1,string2,string3, …)

% 分别将字符串1、字符串2、字符串3……标注到图中,每个字符串对应的图标为画图时的图标。

% ‘Location’用来指定标注显示的位置

legend('样本点','三次埃尔米特插值预测','三次样条插值预测','Location','SouthEast')

3.4subplot分划窗口界面

subplot(4,3,i-1);%将所有图依次变现在4*3的一幅大图上

3.5  axis设置坐标轴

 axis([0 15,-inf,inf])  %设置坐标轴的范围,这里设置横坐标轴0-15,纵坐标不变化

3.6 hold on和grid on继续画图和画网格线

hold on % 继续在之前的图形上来画图形

grid on % 显示网格线

3.7线段的高亮处理

% 在图中高亮我们的最短路径

myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);  %首先将图赋给一个变量

highlight(myplot, P, 'EdgeColor', 'r')   %对这个变量即我们刚刚绘制的图形进行高亮处理(给边加上r红色)

4.数学函数

4.1插值函数

p1 = pchip(x,y,new_x);   %分段三次埃尔米特插值

p2 = spline(x,y,new_x);  %三次样条插值

% n维数据的插值

x = -pi:pi; y = sin(x);

new_x = -pi:0.1:pi;

p = interpn (x, y, new_x, 'spline');

% 等价于 p = spline(x, y, new_x);

figure(3);

plot(x, y, 'o', new_x, p, 'r-')

4.2统计描述

MIN = min(Test);  % 每一列的最小值

MAX = max(Test);   % 每一列的最大值

MEAN = mean(Test);  % 每一列的均值

MEDIAN = median(Test);  %每一列的中位数

SKEWNESS = skewness(Test); %每一列的偏度

KURTOSIS = kurtosis(Test);  %每一列的峰度

STD = std(Test);  % 每一列的标准差

RESULT = [MIN;MAX;MEAN;MEDIAN;SKEWNESS;KURTOSIS;STD]  %将这些统计量放到一个矩阵中表示

4.3皮尔逊相关系数

R = corrcoef(Test)   其中Test是一个矩阵,每一列为同一指标的不同值

R是不同要素的相关系数

[R,P] = corrcoef(Test)

R返回的是一个相关系数矩阵,p返回的是对应于每个相关系数的P值

4.4  T分布的概率密度函数

x = -4:0.1:4;

y = tpdf(x,28);  %求t分布的概率密度值 28是自由度  

figure(1)

plot(x,y,'-')

% matlab可以求出临界值,函数如下

tinv(0.975,28)    %    2.0484

% 这个函数是累积密度函数cdf的反函数

4.5正态分布的JB检验和QQ图

%% 正态分布检验

% 正态分布的偏度和峰度

x = normrnd(2,3,100,1);   % 生成100*1的随机向量,每个元素是均值为2,标准差为3的正态分布

skewness(x)  %偏度

kurtosis(x)  %峰度

qqplot(x)

    

% 检验第一列数据是否为正态分布

[h,p] = jbtest(Test(:,1),0.05)

[h,p] = jbtest(Test(:,1),0.01)

% 用循环检验所有列的数据

n_c = size(Test,2);  % number of column 数据的列数

H = zeros(1,6);  % 初始化节省时间和消耗

P = zeros(1,6);

for i = 1:n_c

    [h,p] = jbtest(Test(:,i),0.05);

    H(i)=h;

    P(i)=p;

end

disp(H)

disp(P)

% Q-Q图

qqplot(Test(:,1))

4.6 斯皮尔曼相关系数

%% 斯皮尔曼相关系数

X = [3 8 4 7 2]'  % 一定要是列向量哦,一撇'表示求转置

Y = [5 10 9 10 6]'%求出的 是X,Y两个变量的相关系数

% 第一种计算方法

1-6*(1+0.25+0.25+1)/5/24

% 第二种计算方法

coeff = corr(X , Y , 'type' , 'Spearman')

% 等价于:

RX = [2 5 3 4 1]

RY = [1 4.5 3 4.5 2]

R = corrcoef(RX,RY)

% 计算矩阵各列的斯皮尔曼相关系数

R = corr(Test, 'type' , 'Spearman')

% 大样本下的假设检验

% 计算检验值

disp(sqrt(590)*0.0301)

% 计算p值

disp((1-normcdf(0.7311))*2) % normcdf用来计算标准正态分布的累积概率密度函数

% 直接给出相关系数和p值

[R,P]=corr(Test, 'type' , 'Spearman')

4.7 图论和最短路径

%% Matlab作无向图

% (1)无权重(每条边的权重默认为1)

% 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图

% s 和 t 都必须具有相同的元素数;这些节点必须都是从1开始的正整数,或都是字符串元胞数组。

s1 = [1,2,3,4];

t1 = [2,3,1,1];

G1 = graph(s1, t1);

plot(G1)

% 注意哦,编号最好是从1开始连续编号,不要自己随便定义编号

s1 = [1,2,3,4];

t1 = [2,3,1,1];

G1 = graph(s1, t1);

plot(G1)

% 注意字符串元胞数组是用大括号包起来的哦

s2 = {'学校','电影院','网吧','酒店'};

t2 = {'电影院','酒店','酒店','KTV'};

G2 = graph(s2, t2);

plot(G2, 'linewidth', 2)  % 设置线的宽度

% 下面的命令是在画图后不显示坐标

set( gca, 'XTick', [], 'YTick', [] );  

% (2)有权重

% 函数graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图

s = [1,2,3,4];

t = [2,3,1,1];

w = [3,8,9,2];

G = graph(s, t, w);

plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2)

set( gca, 'XTick', [], 'YTick', [] );  

%% Matlab作有向图

% 无权图 digraph(s,t)

s = [1,2,3,4,1];

t = [2,3,1,1,4];

G = digraph(s, t);

plot(G)

set( gca, 'XTick', [], 'YTick', [] );  

% 有权图 digraph(s,t,w)

s = [1,2,3,4];

t = [2,3,1,1];

w = [3,8,9,2];

G = digraph(s, t, w);

plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2)

set( gca, 'XTick', [], 'YTick', [] );  

% 注意哦,Matlab中的图节点要从1开始编号,所以这里把0全部改为了9

% 编号最好是从1开始连续编号,不要自己随便定义编号

s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];

t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];

w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];

G = graph(s,t,w);

plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2)

set( gca, 'XTick', [], 'YTick', [] );  

[P,d] = shortestpath(G, 9, 4)  %注意:该函数matlab2015b之后才有哦

% 在图中高亮我们的最短路径

myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);  %首先将图赋给一个变量

highlight(myplot, P, 'EdgeColor', 'r')   %对这个变量即我们刚刚绘制的图形进行高亮处理(给边加上r红色)

% 求出任意两点的最短路径矩阵

D = distances(G)   %注意:该函数matlab2015b之后才有哦

D(1,2)  % 1 -> 2的最短路径

D(9,4)  % 9 -> 4的最短路径

% 找出给定范围内的所有点  nearest(G,s,d)

% 返回图形 G 中与节点 s 的距离在 d 之内的所有节点

[nodeIDs,dist] = nearest(G, 2, 10)   %注意:该函数matlab2016a之后才有哦

5.MATLAB和EXCEL进行交互

xlsread

xlswrite

tab2函数简介

  1. table2array
    • 功能:将表格数据转换为同构数组。
    • 语法A = table2array(T)
    • 说明
      • T 是输入的表格数据。
      • A 是输出的数组数据。
      • 如果 T 是一个每个变量具有一列的 m×n 表,则每个变量都将成为 A 中的一列,并且 A 是一个 m×n 数组。
      • 如果 T 中的变量包含多列,这些变量将成为 A 中的多列,并且 A 的大小大于 T 的大小。
      • 如果 T 包含二维以上的变量,则 A 的维数与变量维数相同。
      • table2array 水平串联 T 中的变量以创建 A。如果 T 中的变量为元胞数组,则 table2array 不会串联其内容,并且 A 也为元胞数组,等效于 table2cell(T)
    • 示例

      T = table([1;2;3],[2 8; 4 10; 6 12],[3 12 21; 6 15 24; 9 18 27],... 'VariableNames',{'One' 'Two' 'Three'}) A = table2array(T)

      结果 A 为:
      1 2 8 2 4 10 3 6 12 3 12 21 6 15 24 9 18 27 ``` [^1^] 
  2. array2table
    • 功能:将数组转换为表格数据。
    • 语法T = array2table(A, 'VariableNames', varnames)
    • 说明
      • A 是输入的数组数据。
      • T 是输出的表格数据。
      • varnames 是一个字符串数组,指定表格中每个变量的名称。
    • 示例

      array = [1 2 3; 4 5 6; 7 8 9]; T = array2table(array, 'VariableNames', {'One', 'Two', 'Three'}) ``` [^5^]

  3. table2cell
    • 功能:将表格数据转换为元胞数组。
    • 语法C = table2cell(T)
    • 说明
      • T 是输入的表格数据。
      • C 是输出的元胞数组。
      • 此函数将表格中的每个变量转换为元胞数组中的一个元素。
    • 示例

      T = table([1;2;3],[2 8; 4 10; 6 12],[3 12 21; 6 15 24; 9 18 27],... 'VariableNames',{'One' 'Two' 'Three'}) C = table2cell(T) ``` [^1^]

交互示例 

clear
clc
load xiaoshou.mat
xiaoshou0=xiaoshou(:,2:end);%去除不必要的表头
xiaoshou1=table2array(xiaoshou0);%转换为浮点数
%summary(xiaoshou0)%使用summary可以对含各种类的表进行统计和分析
lajiao=xiaoshou1(:,1);
shiyongjun=xiaoshou1(:,2);
huacai=xiaoshou1(:,3);
huaye=xiaoshou1(:,4);
shuishenggenjing=xiaoshou1(:,5);
qielei=xiaoshou1(:,6);
%对于类变量,应使用table2cell转化为元胞数组,随后用juzhen{1,1}='A'实现一个数据遍历提取的功能
%内容的搜索使用switch 需要用end不需要用Break

%其他办法:直接导入法:文件地址+表头+
a=xlsread('E:\各类竞赛\数学建模\2024建模国赛培训(7.22-7.27)\2024建模国赛培训(7.22-7.27)\我的论文\数据\日销量数据.xlsx',1,'A2:G1086');

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值