QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3554|回复: 0
打印 上一主题 下一主题

助力国赛 | 第1弹 数据的读入与写入

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组: 2018美赛大象算法课程

    群组: 2018美赛护航培训课程

    群组: 2019年 数学中国站长建

    群组: 2019年数据分析师课程

    群组: 2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-6-7 14:25 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    8 m+ d1 q; a+ R$ x
    助力国赛 | 第1弹 数据的读入与写入
    5 C' y  `0 ^/ H6 L! D4 m" @6 X; Q( ^前言
    全国大学生数学建模(CUMCM)已经成为了大学生参赛规模最大的科技竞赛盛事,而MATLAB作为当前最优秀的数学软件之一,在数学建模中的使用是十分的广泛的。在距离2018国赛还有一个多月之前,小编决定写MATLAB在数学建模中的应用这样一个系列为各位参赛朋友助力,内容还是很丰富的。
    8 |2 D$ f" h8 u" U5 n0 \" Y& R不过在此之前,先要简单的说明几点。其一,由于MATLAB基本操作系列还没有更完(主要是小编比较“懒”),按这个系列来的朋友可能还不知道MATLAB的基本操作与语法等,但这都是无关紧要的事情因为MATLAB真的很容易上手,那就默认各位MATLAB的基本操作都会了。其二,小编准备把这个系列的重点放在一些智能算法上,毕竟在都使用常规方法的比赛大军中,如果能合理使用一些智能算法来求解问题是会让人眼前一亮的,但我们还是先从常规的处理数据的方法介绍起。其三,最好修过高数、线性代数和概率论与数理统计相关课程,如果你还学过数值计算和运筹学等课程,那就太好了,因为我们会重点介绍里面函数的使用,至于里面包含的数学原理会提及到但不会详细说明。3 t- f8 Y2 K* g: p0 u2 U. u& N
    最好祝各位,身体健康,建模愉快。
    • 计划安排
    • Excel与MATLAB的数据交互
    • 记事本与MATLAB的数据交互2 u6 |0 H: J4 n* R. L& Y+ L

    ! E' x6 |3 _1 W! i" s( r计划安排
    先说一下,个人对数学建模的理解,首先这是一个比赛,最后提交的是一篇论文,所以负责写作的同学任重而道远,建议使用LaTeX,Word用过的人都知道那就不吐槽了。当然写作是需要东西的,稍微胡扯点是可以的,但通篇胡扯就有点说不过去了,更何况这是科技论文,所以负责编程和建模的同学就得努力了。编程和建模是分不开的,也是不能分开的,你说你建了一个十分漂亮的模型像花一样,但解不出来,在我看来一点价值都没有,你说你各种算法了如于心,一上来就是什么BP啊,遗传啊,支持向量机啊,但一看到题就不知道怎么办了,那就不知道这是“真懂”啊还是“自己懂”啊。这是一个系统的工程,是需要相互帮助的,互相配合的。合作中有分工,分工中有合作,这样子多好啊,何必有要去破坏呢?
    - x$ U& o, |, k* w扯远了,话归正题。计划是先从常规的方法入手,这主要包括数据的拟合和插值问题、规划问题(这是一个很重要的模型,要好好去研究研究)还包括部分的数据可视化操作,再之进入灰色预测,然后会迎来我们的重头戏——智能算法。智能算法主要包括,人工神经网络、遗传算法、粒子群算法和模拟退火算法。然后会介绍其他比较有用方法,这主要包括小波分析和计算机模拟。大概安排就是这样,如果有所变动,以后再说。3 T) G; T( l- }7 A& }
    本文主要介绍,如何在MATLAB上进行数据的读入与读出,因为这是我们进行数据分析的第一步。数据处理是数学建模的基础,我们是通过分析数据来得出结论和获得信息的。从数学建模的角度来看,将数据反映出来的信息转化成数学表达式是建模的基础,通常对数据处理做的其实就是趋势分析或者将其转化为函数表达式。在这些方面由于MATLAB包多,处理起来就十分的方面了。
    Excel与MATLAB的数据交互
    Excel表格是比较常用的数据储存软件,在数模中提供的数据往往就是Excel格式的,如何将其读入MATLAB中往往就成了数据分析的第一步。其实可以通过,一个一个的输入或者复制粘贴,但这样往往耗时较多且无法保证数据的准确传播,谁没有手“斗”一下的时候呢?接下来将会介绍如何在Excel中获取MATLAB中的数据,或者在MATLAB中获取Excel的数据。
    ) u+ K# {/ _- BMATLAB中的Excel Link工具是一个实现与Excel进行交互的插件。通过Excel Link工具,用户可以在Excel工作区和MATLAB工作区之间进行数据交换,也可以在Excel中调用MATLAB的函数。
    5 X7 @) W& V$ ~) b% s
    安装
    Excel Link的安装是在MATLAB安装过程中,随其它组件一起安装。安装完成后,还需要在Excel中进行一些设置和才能使用。
    设置
    选 Excel “文件”菜单的 “选项”菜单项,打开“Excel选项”对话框。
    6 j5 s. e' B! M  }! v在“Excel选项”对话框中,选左边栏的“加载项”, 然后单击右边面板下部的“转到”按钮,弹出 “加载宏”对话框。
    6 S6 a) A6 M4 z3 E) ^
    * W7 `& H/ T% s+ u! _
    在“加载宏”对话框中,单击“浏览”按钮,打开文件“浏览”对话框。
    * t$ G) \" f; j5 [8 Z
    在文件“浏览”对话框,选MATLAB的安装文件夹的子文件夹toolbox\exlink。在文件夹exlink中选excllink.xlam文件,单击“确定”按钮返回。

    7 w& c. n0 n% X8 _5 [" W1 p
    “加载宏”对话框的“可用加载宏”列表中多了一个“Spreadsheet Link 3.2.5 for use with MATLAB and Excel”选项。选中该项,返回Excel窗口。
    MATLAB命令组
    加载Spreadsheet Link 后,在Excel窗口“开始”选项卡中多了一个MATLAB命令组。命令组中包含的一组命令项,分别用于实现启动MATLAB、导入和导出数据、调用MATLAB函数等。
    9 d, P' B9 S( B; U9 C( a  C* [# ~
    将Excel表格中的数据导出到MATLAB工作空间
    文件“data0.xlsx”,将其中的A~D列的数据导出MATLAB工作区,存入变量data0。
    namestypesxyanswerSallyType13.145YesTomType12.520NoJoyType30.511NoLilyType22.180Uncertain
    操作步骤:
    " s* l7 Q& w' d- P5 f2 t9 F. _3 T+ V①在Excel中选中5列,单击 “开始”选项卡工具栏“MATLAB”按钮,从下拉列表中选“Send data to MATLAB” 命令。
    2 _  {. p- W  A& L
    7 u1 w& I4 {, |: {; e
    ②在弹出的对话框中填入变量名data0,单击“确定”按钮完成导出操作。
    % P4 D! D1 d$ C/ i+ w6 C" ~
    因为选中的各列数据类型不同,所以data0为cell数组。
      M/ @. `0 o0 B! P( Y5 O
    然后就可以进行下一步操作了。

    % c" I( |7 w' y5 y( r1 r8 O0 c从MATLAB工作空间导入数据到Excel表格中
    在Excel表单选中要导入数据的起始单元格,单击 “MATLAB”按钮,从下拉列表中选“Get data from MATLAB” 命令,在弹出的对话框中输入MATLAB变量名,单击“确定”按钮完成导入操作。
    ! ]  A0 {0 i0 y% G- ~

    0 Y, z9 E* A* Y$ a: Y  _' y; A在Excel中调用MATLAB函数进行运算
    例如:调用MATLAB的magic函数在Excel中生成6阶魔方矩阵。, }. O+ k( ]% [, I. Z: t& _$ b% r" b
    (1)选择函数
    ' S+ i6 a0 {/ k' E: ^
    ( P# B0 c  k6 ^- F9 B

    : b0 `2 U7 ~5 q2 Y
    (2)设置参数
    从MATLAB中导入图片到Excel
    需要先在MATLAB绘制出图片,然后选择相应命令。; C& [- s' ?- _! l8 n* |  s
    , G" ^$ o; z5 `5 X, b1 M

    9 n# B  ]8 Z' v: ?$ h$ ?
    当然上面的方法很方便进行MATLAB和Excel的数据交互,但是我们有时候需要在MATLAB代码中读取Excel上的数据,就需要用到另外一个函数了。

    9 `) L% m/ \9 }+ M5 F. xMATLAB读取Excel上的数据
    1.使用函数xlsread读取单个文件
    4 O1 j% x. I! P# E& z0 u(1)num=xlsread(filename)4 s1 Z4 a# G5 Y; z" D
    filename是单引号括起来的带路径的文件名,函数直接读取filename所指文件的sheet1中的数据区域存储到双精度矩阵num中;其中,数据区域的选取规则是:对表格前几个含有非数值的行(列)直接忽略,不算入数据区域;另外如果在数据区域中含有非数值的单元,将其处理为nan。$ A7 z' z2 v; [) R3 R
    (2)num = xlsread(filename, -1)
    9 F) }5 d$ p& p% V输入后matlab将会打开相应的exel文件,用鼠标选择需要导入的数据区域,可以切换到想要的sheet。
    " ~9 P* {( c" L' B  N(3)num = xlsread(filename, sheet)8 m: t- u0 M+ }7 ?8 Z
    其中sheet用来指定读入excel文件的第几个sheet,此时的sheet取值大于1的整数。+ `3 |6 [' q* h( _# z
    (4)num = xlsread(filename,sheet, 'range')6 U, \$ [" U3 b5 u0 g$ w
    其中range指定一个矩形的区域,用单引号括起来;例如:'D2:H4'代表以D2和H4为对角定点的矩形域;) y' S6 [! M$ v. z
    注意当excel中有合并单元格时,任何一个合并前的单元格的名字(比如D1)都会指代整个合并后的单元格,而将整个单元格读入,所以为了避免麻烦,尽量避免在需要读入的表格中合并单元格。
      ~/ T+ }( G+ d9 M4 J( V, F1 v; \5 R由于比较简单,在此就不再演示了。
    记事本与MATLAB的数据交互
    在MATLAB中可以读取存入记事本中的数据,也可以将MATLAB中的数据保存在记事本中,以便后续操作。
    MATLAB读取记事本中的数据
    当记事本中全是数据时,可以使用load函数,其调用格式如下:
    load(filename)
    & S, _4 R4 O. }) _8 ^9 X3 p) o
    其中filename是被单引号包括的文件的名字和扩展名,运行此函数后会把记事本中的数据按矩阵的形式导入到名为filename的变量中。
    - u. F  P; f& n8 y2 k) U  l但是当记事本中的数据结构变得复杂时,既有数据类型又有字符类型时,就不能使用load函数了,可以考虑使用‘textread’函数,调用方式如下:
    [A,B,C] = textread(filename,format,N)
    ; h4 Y6 s) w1 j6 [- Z9 K/ `
    其中,A,B,C,...为每一列数据将要保存的变量名;format为读取格式;N为读取次数。
    9 t. D+ m. G) s常见的读取格式有:
    format由%加上格式符组成,常见的数值格式控制符如下:
    • '%d':整数。
    • '%f':小数形式的实数。
    • '%e':科学计数法形式的实数。
    • '%c':字符。
    • '%s':字符串。. d. ~( S5 M0 v$ [. |$ R; B. Z8 J( l
    ( Y- R+ k/ D4 s# o) a
    在%之后还可以加上数据宽度,例如%3d,%10.3f。
    3 `* Y' R! F# c看如下一个例子:! T3 T$ e0 p* \4 [& p, \7 a$ C
    数据类型如下:
    6 ^; q: ?0 l3 C( p5 a) q! y( N, c
    ) {1 I; Y& n, I0 j9 l
    MATLAB读取该test.txt文件:

    , J# |) }1 ]/ [8 } >> [name,type,x,y,answer] = textread('test.txt','%s Type %n %f %n %s',2)  name =    2×1 cell 数组      'Sally'     'Tom' type =     1     1x =    3.1000    2.5000y =    45    20answer =  2×1 cell 数组    'Yes'    'No'$ k$ P+ i  k: f2 Y) J" j7 R: n) Z
    在该程序中最后一个参数2表示读取两行数据。
    4 A7 Q( Z; z( R! d: o) P( t在MATLAB中,还有一个函数fscanf可以读取记事本中的文件,功能十分的强大,如果感兴趣可以进行百度或者Help帮助。
    将MATLAB数据写入记事本中
    如何写入数据?用save函数,调用格式如下:
    save file obj1 obj2.....( B" O8 M( }& Q  Y7 b& O. T4 L
    将个变量obj1,obj2.....存入文件file中(是.mat格式)。如果我们想保存为.txt格式,可以考虑使用函数‘fprintf’。看如下一个例子:
    fid = fopen('tp.txt','wt'); fprintf(fid,'This is the database of class 1.\n'); name = 'Sally';types = 1;x = 3.1; y = 45;answer = 'Yes'; fprintf(fid,'%s Type %u %f %u %s \n',name,types,x,y,answer); name = 'Tom';types = 1;x = 2.5; y = 20;answer = 'No'; fprintf(fid,'%s Type %u %f %u %s \n',name,types,x,y,answer); name = 'Joy';types = 3;x = 0.51; y = 1;answer = 'No'; fprintf(fid,'%s Type %u %f %u %s \n',name,types,x,y,answer); name = 'Lily';types = 2;x = 2.1; y = 80;answer = 'Uncertain';fprintf(fid,'%s Type %u %f %u %s \n',name,types,x,y,answer);fclose(fid);4 j1 f, \2 Z1 ^% {( E1 E* x+ V% M* v
    运行结果如下:
    0 G) {* Q& \0 }  s! A- R; p9 @
    ) T7 ]$ s: N6 K% I* l, ~% K! p
    在程序中第一句是打开一个文件,返回一个指标fid,第二句就是在文件中写入一句话,然后后面就是不断追加,如此而已,还是十分简单的。
    ( H; j, e) \& X- l7 M8 Y+ O5 q9 X" e
    ( s. N8 r- f" f; l# `' L! L

    ; L& V1 V/ j7 v5 t3 c. W0 {* |# x% U- E& G( G

    : Q: _$ Y& K; }0 [
    编辑不易,欢迎推广

    . [5 m- X, r1 G$ }2 f$ s1 ^6 \$ g$ L) O
    9 }0 O/ d0 u# t3 N/ A: Q
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-1 03:44 , Processed in 0.331243 second(s), 51 queries .

    回顶部