冲刺数学建模(1)

发布时间 2023-07-18 23:43:38作者: 寒心小呆

MATLAB基础操作

开始时间2023-07-18 21:08:59

结束时间2023-07-18 23:34:43

前言:出去完了好几天,又在家里躺了两天尸,稍微认真学一点吧,简单开个新篇章,呜呼!

A.1 Matlab帮助的使用

1 help elfun %关于基本函数的帮助信息
2 help exp %指数函数exp的帮助信息
1.help

1 当要查找具有某种功能但不知道准确名字的指令时,help的能力就不够了,lookfor可根据用户提供的完整或不完整的关键词,去搜索出一组与之相关的指令。
2 lookfor integral %寻找有关积分的命令
3 lookfor fourier %查找能进行傅里叶变换的指令
lookfor命令

1 在MATLAB中,关于有关函数的“帮助”信息可以用doc命令以超文本的方式给出
2 doc
3 doc doc
4 doc eig %eig求矩阵的特征值和特征向量
超文本格式的帮助

1 可以从MathWorks网站上下载有关的pdf{}“帮助”文件。
pdf“帮助”文件

 A.2 数据的输入

11)要直接输入矩阵时,矩阵一行中的元素用空格或逗号分隔;矩阵行与行之间用分号“;”分隔,整个矩阵放在方括号“[]”中。
22)矩阵的分行输入
简单矩阵的输入

 1 ans %用于结果的默认变量名
 2 pi %圆周率
 3 eps %浮点相对精度
 4 inf %无穷大,如1/0
 5 NaN %不定量(非数),如0/0
 6 i(j) %i=j=根号下-1
 7 nargin %所用函数的输入变量数目
 8 nargout %所用函数的输出变量数目
 9 realmin %最小可用正实数
10 realmax %最大可用正实数
特殊变量
1 t=[0:0.1:10]
2 %产生0~10的行向量,元素之间的间隔为0.1
3 t=linspace(n1,n2,n)
4 %产生n1和n2之间线性均匀分布的n个数
5 (默认n时,产生100个数)
6 t=logspace(n1,n2,n)
7 %在10的n1次方和10的n2次方之间按照对照对数距离等间距产生n个数
8 (默认n时,产生50个数) 
特殊向量
特殊矩阵

A.3 绘图命令

 1 二维绘图的基本命令有 plot,loglog,semilogx,semilogy 和 polarplot。
 2 它们的使用方法基本相同,其不同特点是在不同的坐标中绘制图形。
 3 plot 命令使用线性坐标空间绘制图形;
 4 loglog 命今在两个对数坐标空间中绘制图形;
 5 而 semilogx(或 semilogy)命令使用x轴 (或1轴) 为对数刻度,另外一个轴为线性刻度的坐标空间绘制图形;
 6 polarplot 使用极坐标空间绘制图形。
 7 二维绘图命令 plot 为了适应各种绘图需要,提供了用于控制线色、数据点和线型的 3 组基本参数。它的使用格式如下:
 8 plot(x,y,'color_point linestyle')
 9 如果多重曲线对应不同的向量绘制,可使用命今plot(t1,x1,t2,x2,t3,x3)
10 subplot 命令使得在一个屏幕上可以分开显示 n个不同坐标系,且可分别在每一个坐标系中绘制曲线
11 其命令格式如下
12 subplot(r,c,p)
13 在图形绘制完毕后,执行如下命令可以再在图中加入标题、标号、说明和分格线等。这些命令有 title.xlabel,ylabel,text,gtext 等。
14 它们的命令格式如下title('My Title’) ,xlabel('My X-axis Label)
15 ylabel(My Y-axis Label’).
16 text(x,y,'Text for annotation')
17 gtext('Text for annotation'), grid
18 gtext命令是使用鼠标器定位的文字注释命令当输入命令后,可以在屏幕上得到一个光标,然后使用鼠标器控制它的位置。按鼠标器的左键,即可确定文字设定的位置。
19 hold on 是图形保持命令,可以把当前图形保持在屏幕上不变,同时在这个坐标系内绘制另外一个图形。hold 命令是一个交替转换命令,即执行一次,转变一个状态 (相当于 hold on、hold off)
二维绘图命令

A.3.2 显函数、符号函数或隐函数的绘图

1 folot(fum,lims)绘制由字符串 fn 指定函数名的函数在X轴区间为 lims-[xmim,xmax]的函数图。
2 若ims=[xmin,xmax,ymin,ymax],则y轴也被限制。
函数

A.3.3 三维图形

1 在实际工程计算中,最常用的三维绘图是三维曲线图、三维网格图和三维曲面图 3 种基本类型。与此对应,Matlab 也提供了一些三维基本绘图命令,如三维曲线命令 plot3 和 fplot3。三维网格图命令 mesh和fmesh,三维表面图命今surf和fsurf。其中的fplot3fmesh 和 fsurf 是使用函数进行绘图,比较方便,也容易使用。还有 3 维隐函数画图命令 fimplicit3,下面给出这些函数的用法示例。
三维图形
1 plot3(x,y,z)通过描点连线画出曲线,这里x,y,z都是n维向量,分别表示该曲线上点集的横坐标、纵坐标、竖坐标。
三维曲线
1 命令mesh(x,y,z)画网格曲面。这里x,y,z是三个同维数的数据矩阵,分别表示数据点的横坐标、纵坐标、竖坐标,命令mesh(x,y,z)将该数据点在空间中描出,并连成网格。
网格图
1 命令surf(x,y,z)画三维表面图,这里x,y,z是三个同维数的数据矩阵,分别表示数据点的横坐标、纵坐标、竖坐标。
表面图
1 隐函数,可以直接使用隐函数画图命令fimplicit3画图;
2 还可以先把旋转曲面化成参数方程,使用命令fmesh画图。
旋转曲面
Matlab中使用绘图命令fmesh或fsurf,画显函数或参数方程表示的二次曲面很方便,或者直接使用fimlicit3画隐函数表示的二次曲面
二次曲面图形

A.4 数据处理

1 把Matlab工作空间中的数据矩阵a,b,c保存到数据文件dataA_27.mat中。
2 save  dataA_27.mat  a  b  c
3 注:Matlab中的默认数据文件mat文件可以省略后缀名。
4 把例A.27生成的dataA_27.mat中的所有数据加载到Matlab工作空间中。
5 load('dataA_27.mat') 
MATLAB中的默认数据文件mat文件
 1 可以把word文档中整行整列的数据粘贴到纯文本文件,然后调入到Matlab工作空间中。
 2  把纯文本文件dataA_29.txt加载到工作空间。
 3 a=load('dataA_29.txt');
 4 或者是
 5 b=readmatrix('dataA_29.txt');
 6 使用writematrix命令把矩阵b保存到纯文本文件dataA_30.txt。
 7 b=randi([0,10],3)  %生成3阶随机整数矩阵
 8 writematrix(b,'dataA_30.txt')
 9 生成服从标准正态分布随机数的 矩阵,再保存到Excel文件dataA31.xlsx。
10 clc, clear, a=normrnd(0,1,100,200);
11 writematrix(a, 'dataA_31.xlsx')
纯文本文件
1 把一个 矩阵写到Excel文件dataA_32.xlsx表单Sheet2中B2开始的域中。
2 a=rand(5,10); warning('off')
3 writematrix(a, 'dataA_32.xlsx', 'Sheet', 2, 'Range', 'B2')
4 把例A.32生成的Excel文件dataA_32.xlsx中表单Sheet2的域“C3:F6”中的数据赋给b。
5 b=readmatrix('dataA_32.xlsx','Sheet',2,'Range','C3:F6')
Excel文件
 1 统计下列五行字符串中字符a、c、g、t出现的频数。
 2 1.aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg
 3 2.cggaggacaaacgggatggcggtattggaggtggcggactgttcgggga
 4 3.gggacggatacggattctggccacggacggaaaggaggacacggcggacataca
 5 4.atggataacggaaacaaaccagacaaacttcggtagaaatacagaagctta
 6 5.cggctggcggacaacggactggcggattccaaaaacggaggaggcggacggaggc
 7 
 8  把上述五行复制到一个纯文本数据文件dataA_34_1.txt中,编写如下程序:
 9 clc, clear, f=fopen('dataA_34_1.txt'); i=1;
10 while (~feof(f))
11     d=fgetl(f); a=sum(d==97); c=sum(d==99);
12     g=sum(d==103); t=sum(d==116);
13     n=sum(d>=97&d<=122); %检验26个小写字符的个数
14     s(i,:)=[a, c, g, t, n, a+c+g+t];
15     i=i+1;
16 end
17 s, he=sum(s)
18 writematrix(s,'dataA_34_2.txt')
19 其他的一些字符串处理命令有strcmp,strfind等。
字符串数据
 1 例A.35  把一个比较大的bmp图像文件dataA_35_1.bmp,转化成比较小的jpg文件,命名成dataA35_2.jpg,并显示。
 2 
 3 a=imread('dataA_35_1.bmp'); subplot(121), imshow(a)
 4 imwrite(a,'dataA_35_2.jpg');
 5 subplot(122), imshow('dataA_35_2.jpg')
 6 例A.36  生成10幅彩色jpg文件,依次命名成A_36_1.jpg,…,A_36_10.jpg。
 7 
 8 clc, clear
 9 for i=1:10
10     str=['A_36_',int2str(i),'.jpg'];
11     a(:,:,1)=rand(500); a(:,:,2)=rand(500)+100; a(:,:,3)=rand(500)+200;
12     imwrite(a,str);
13 end
图像文件
 1 例A.37  现有数据文件A_37_1.xlsx,…,A_37_5.xlsx,用命令importdata读入数据。
 2 
 3 clc, clear
 4 mydata=cell(1, 5); %初始化存放各个文件数据的细胞数组
 5 for k=1:5
 6     filename=sprintf('A_37_%d.xlsx', k); %构造文件名的格式化字符串
 7     mydata{k}=importdata(filename); %从文件导入数据
 8 end
 9 celldisp(mydata) %显示细胞数组的数据
10 
11 例A.38  现有数据文件A_38_01.xlsx,…,A_38_05.xlsx,读入各Excel文件的第2个表单(Sheet2)的域“A1:C3”的数据。
12 
13 clc, clear, d=cell(1,5); %初始化
14 for k=1:5
15     fileName=sprintf('A_38_%02d.xlsx',k);
16     d{k}=readmatrix(fileName,'Sheet',2,'Range','A1:C3');
17 end
18 celldisp(d) %显示细胞数组的数据
19 
20 例A.39  读入当前目录下所有后缀名为xlsx的Excel文件的数据。
21 
22 clc, clear
23 fi=dir('*.xlsx') %提出Excel文件的信息,返回值是结构数组
24 n=length(fi); %计算Excel文件的个数
25 d=cell(1,n); %初始化
26 for k=1:n
27     d{k}=importdata(fi(k).name);
28 end
29 celldisp(d) %显示细胞数组的数据
数据的批处理
1 clc, clear
2 rng('shuffle')  %根据当前时间为随机数生成器提供种子
3 a=randn(6,1); %生成服从标准正态分布的伪随机数
4 b=[today:today+5]'  %从今天到后面5天
5 c=datetime(b,'ConvertFrom','datenum')
6 T=array2timetable(a,'RowTimes',c)  %生成时间序列数据
7 T.a(3)=NaN;  %将第3个数据变为缺失值NaN
8 newT=fillmissing(T,'linear') %用线性插值填补时间序列中的缺失数据
9 data=table2array(newT) %时间序列数据转成普通数据
时间序列处理数据
 1 Matlab日期和时间的函数有datenum,now,clock,date,calendar,eomday,weekday,addtodate,etime等。
 2 例A.41  统计1601年1月到2000年12月,每月的13日分别出现在星期日、星期一、星期二,…,星期六的频数,并画出对应的柱状图。
 3 
 4         注:Matlab中weekday的1对应“星期日”,2对应“星期一”,…,7对应“星期六”。
 5         解  所画出的柱状图见图A.1,Matlab程序如下:
 6 clc, clear, c=zeros(1,7);
 7 for y=1601:2000
 8     for m=1:12
 9         d=datetime(y,m,13);
10         w=weekday(d);
11         c(w)=c(w)+1;
12     end
13 end
14 c, bar(c)  %显示频数并画出频数的柱状图
15 axis([0 8 680 690])
16 line([0,8],[4800/7,4800/7],'linewidth',4,'color','k')
17 set(gca,'xticklabel',{'Su','M','Tu','W','Th','F','Sa'})
日期和时间

 1 Matlab除了支持各种图像文件的读写等操作,还支持视频文件的相应处理。实际上,视频文件本质上是由多帧具有一定大小、顺序、格式的图像组成的,只是一般的图像是静止的,而视频是可以将多帧静止的图像进行连续显示,从而达到动态效果。
 2 
 3 例A.42  读取一个视频文件test.avi,并把视频中的每一帧保存成jpg文件。
 4 
 5 clc,clear
 6 ob=VideoReader('test.avi')     %读取视频文件对象
 7 n=ob.NumFrames;  %获取视频的总帧数
 8 for i=1:n
 9     a=read(ob,i); %读取视频对象的第i帧
10     imshow(a)  %显示第i帧图像
11     str=['pic\',int2str(i),'.jpg']; %构造文件名的字符串,目录pic要提前建好
12     imwrite(a,str); %把第i帧保存到jpg文件
13 end
视频文件

总结:使用了一波MATLAB这个软件,它不像所学的c语言,c++语言,py、java,它更像是一种工具,是一种由高级语言搭建起来的对数据和文件进行处理和操作的应用程序,而学的各种方法更像是这个应用程序的操作指南。形象一点,我现在有一些钢铁塑料,有人用聪明的双手将原材料打造成一个洗衣机(用高级语言创造出应用程序),然后要做的工作是学习如何把脏衣服用洗衣机洗干净的操作。使用的大概一个星期,我发现MATLAB数据可视化和数据分析方面十分强大,也存在编程的工作,虽然我不认为我的高级语言学的很好,但是MATLAB编程仍是非显著式编程我有高级语言的底子在入门还是很轻松的,好了,就不多说了。