收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

MATLAB处理数据,掌握这7个小技巧就够了

[复制链接]
1 d: I9 V5 W1 w8 K; M+ z+ |

最近一段时间,工作上花了不少时间用MATLAB处理工厂下线的数据,数据庞大不说,复杂度也高,各种推算和统计

( r/ I( ^3 p. J! B

所以今天我打算总结一下,平时我在用MATLAB做数据分析时常用的几个小技巧

- v- Y7 X4 Y/ r( Z8 Y

正好全国大学生数学建模竞赛下周就要开始了,希望今天的分享对参赛的朋友有所帮助

! m: f! |2 o) d- v) E8 A- h# W: X

虽然不知道到时候会有哪些选题,但是能肯定的是,不管是什么题目,都离不开数据分析,这是唯一比赛前能好好准备的

, w: B! Z9 p' p6 f: J( ^" `

1. 数据类型的转换

. T# w( c9 y4 I; d

有一类问题,不论你MATLAB水平如何,平时写代码的时候多少总会遇到,就是数据类型不一致,需要转换

M3 S, s ?" n, h3 c* V

至于什么是数据类型,这个问题我就不科普了,大家可以直接在MATLAB命令栏“doc 数据类型”

* _( @* y! b& c
+ Y. J! ?2 _! D" |+ p6 E" a

通常在数据转换这个问题上,涉及到的比较常见几种的数据类型有double,char,cell,struct

4 N9 L: G x+ g# B

我给大家准备了一张数据类型转换的关系图,用class判断一下转换前的两种数据类型,然后按照下面这张图处理就完事了

+ T( }1 R9 y+ W/ K% p$ t k5 M
6 i0 x# z3 `( G3 ]3 n7 f. _; T

2. 字符串的对比

/ L( Y! o" S) [3 W

第二个经常需要处理的问题是,字符串的对比

" z9 R6 U$ Y+ d. I6 @( \9 o7 s

这里不单单指的是字符串,还包括cell元胞里面的字符串定位

& o; S7 P4 r E$ B& ^% ?3 |

如果单纯只是字符串的话,要判断两个字符串是否相同,strcmp函数可以实现对比

$ J9 @. ^( J1 m' H. t6 l. m5 j
strcmp(abc,abc)
1 I1 I3 j* g* J0 K0 d; |

判断字符串中是否包含某种字符串,可以使用contains函数

1 a$ o# }. |6 p/ x: @
contains(abc,ab)
& l9 ^3 N- b& Y, h2 N, N- _

判断字符串中在哪几位出现某种字符串,可以使用regexp函数

5 y1 }. A* l$ W ?# R5 T9 g# q" q
regexp(abac,a)
. i; a; g ^4 v t, Z! P1 n. Z

更常碰到的场景是,在cell元胞里面判断字符串,比如维度1x1000的cell中,定位哪几个cell里面的字符串是‘abc’,还是通过strcmp实现对比,再通过find定位

* j* K( B( M. e/ N
a = strcmp(Cell_variable,abc);8 m+ S1 c: I! o1 g b = find(a == 1)
/ c4 ~. l: X! L7 u5 L0 ]

同样,要判断这1x1000的cell中,定位哪几个cell中的字符串,带有‘ab’,可以使用contains函数,再用find定位

* @# k5 q2 `2 Y$ v6 q
a = contains (Cell_variable,ab);( e" M8 D$ `$ @3 P; ] b = find(a == 1)
) t7 e& L7 r. _: l

掌握上面这两点,在平时处理cell的字符串,基本上就够用了

' L) s9 J! B( G8 w6 L

3. 文件的读取写入

2 ]! k0 c; J, @2 ~! n" r

文件的读取写入同样非常重要,在数据分析过程中,对应着信息的获取和数据处理结果的输出

6 k4 o7 {# [: y; B* t, f$ x7 k; W

mat, txt, excel是平时最常碰到的文件类型

4 Q: H: x6 n9 V4 `* k% |

mat就不用多说了,MATLAB中的一种文件类型,用于存储workspace中的变量,在数据分析过程中,可以经常把运算结果或中间阶段的数据,作为mat进行保存

3 P! U6 {3 ^7 P( ]! e" o9 T

加载mat文件,用的是“load 文件名”命令,也可以双击mat文件,保存mat文件,用的是“save 文件名”命令,也可以workspace右键保存

9 O& d! L& U- Y+ C

txt的读取方式有非常多,网上也有各种各样的介绍,我就介绍两种最常用,也是目前我一直在用的两种方法

& {) y; X; ~% D; w( [& g1 a

第一种是通过importdata(‘test.txt’)命令,读取的结果是一个多行一列的cell元胞,后续的数据处理也就方便了,cell里面的字符串定位处理在前面也已经介绍过

: p4 @& T* f0 k% k* S

另一种方法是,通过MATLAB工具条里的“导入数据”按钮,这种方法的一个好处是,导入过程中有很多非常人性化的设置,比如数据的分隔,范围定义,数据的输出类型等等

+ e) C6 x1 }) n3 }' |! e4 ?

导出的选择也有不少,可以选择直接导出到workspace,也可以选择生成脚本或者是function,方便同类型文本的重复使用,对于不太喜欢写脚本导入数据的朋友,我比较推荐这种方式

7 g7 g6 N. J3 U3 ]' {5 E, }
$ z }" C& `% U. e" ^
5 I9 b( ~: Z9 j4 g" S
5 k6 H6 a6 t, y4 h; S: c7 T

txt的写入,可以通过fopen,fprintf,fclose实现,基本上我所有GUI中关于代码生成的功能,都是通过这个方式将代码写入m脚本的,给大家举一个简单的txt写入的例子代码

5 x/ i$ t5 C2 c9 U
fid = fopen(test.txt,wt); ( v1 f. q) \" I+ x9 Z6 ^0 R4 J fprintf(fid,test1\n);7 ?( k" @5 o; F: g fprintf(fid,test2\n);* {4 h4 \* q) g$ G q1 A9 L fclose(fid);
/ ~- E M, l, X: ]) v

关于txt的读取写入,我再多介绍一点,txt是文本文件中的一种,就是那种右键打开能读得懂的文件。类似的文本文件还有很多,像m文件,mdl模型文件,dcm文件,c代码等等,只要是文本文件,都可以用txt处理的方式,对目标文件进行读取写入。

: V6 {5 J0 ~2 L. _0 x! e$ O

最后讲一下Excel读取写入的问题,常写MATLAB脚本的朋友,对xlsread和xlswrite肯定不陌生,对应的是Excel的读取和写入

, c& l/ |5 @8 w* {8 z/ D
[num,txt,raw] = xlsread(filename,sheet,xlRange) 9 [4 Z* ?" X' B6 z xlswrite(filename,A,sheet,xlRange)
3 t& u% j4 u0 U2 Q8 B! Q& X6 g

但是目前MATLAB官方已经不推荐使用这两种方式了,替代的函数是readtable和writetable

# c/ d9 A0 Q: y
T = readtable(filename)! a$ c% y" }, s, m2 h5 d, l' R writetable(T,filename)7 X1 X$ x1 ]2 E+ b: |4 n
$ S/ e% C- m) {4 R- `; c

如果数据是cell元胞的话,替代的函数是readcell和writecell

2 p. X- h( c; v- j
T = readcell(filename)4 ^- f. P7 {4 t" [( a/ ]3 s. @ writecell(T,filename)
" |; y7 _% x. f( T& v

大家根据自己的个人习惯选择其中一种方式,两种方式在功能实现上目前并没有太大区别

! A5 ]0 K+ f$ m' y7 q

4. 数据可视化

9 `( E2 t' r! j4 {- s

数据可视化,结果的呈现,也是数据分析过程中至关重要的一环

6 N6 x" ?9 R$ O& ?: @. A( |

像大家非常熟悉的函数plot,就可以用来画曲线图,但是有时候仅仅曲线图并不足以来呈现结果,还需要用到比如像三维图,柱状图,饼状图,蜡烛图等等

v5 ?9 G* Y8 M; T6 J% V% r

这部分我并不打算给大家罗列各种图形对应代码命令,大家也没必要刻意地去死记这些代码,安利一个非常通用的方法

; _! i3 m" L) c9 C9 a! w9 J

在选择需要可视化的数据之后,在MATLAB工具条的绘图窗口,选取你喜欢的图形,就能生成你需要的结果图了

+ i, Z- i- d0 Z1 {" h, F# j
( Z% w( S# _. ^4 @

不过,至于图片的细节,像title,legend,网格,还是需要自己微调,但这都不是事,再安利大家一个简单的方法,完全不用上网去搜

& G2 s% g: Y9 w

在生成窗口中,点击属性检查器,然后根据自己的需要完善图片的细节,最后通过生成代码,就能看到这部分作图操作的原始代码了,大家也能在代码的基础上再微调,或者复用

1 Q+ P& S. ~& ]
5 ]" {1 C5 r) `4 s% y
3 v6 Z) Y. [5 @* J# g( M
- C6 _0 b/ J2 y2 E) e W1 x

5. 数据处理的常用函数

( u5 v5 R# {0 h1 ~6 a0 j

关于数据处理的函数,像max,min,mean,std这些函数都是比较常用的函数,分别是最大值,最小值,平均值,标准差

* J, b$ ~5 Y# o$ Z' {# B: t1 p

再安利大家几个平时我在处理数据时最常用的几个函数

9 `9 c+ Q" Y" B. F, D6 Z7 U5 p

第一个是unique函数,可以把数据中重复的数据删去,保留唯一值。unique这个函数不仅仅对数值矩阵有效,在cell中同样起作用

: A) g# Y; {$ l' s0 ]* {* r
C = unique(A)
: c4 ?; p9 d- d

unique还有一些拓展的语法和功能,有兴趣的朋友可以在MATLAB文档中查看,不过光这个基本功能,就已经非常够用了

# c0 X+ e8 O: K! ~

第二个要推荐的函数是排序,sort和sortrows,两种函数都有排序的功能,但是使用场景不太一样

9 Y# N( Z9 {% s

sort的功能是,将矩阵或者cell中的每行或者每列进行升序或降序排列,其中A代表待处理的矩阵或cell数据,dim的选择有1和2,分别代表对每列和每行进行排序,direction的选择有ascend或 descend,分别代表升序和降序

% j/ M% X; v' ^/ r' g
B = sort(A,dim,direction)
8 K' H( h/ i' f7 Y

sortrows的功能是,将矩阵或者cell根据某一列进行升序或降序排列,其中A代表待处理的矩阵或cell数据,column代表根据第几列进行排序,direction的选择有ascend或 descend,分别代表升序和降序

' i7 M# I( E* v7 V. d3 j
B = sortrows(A,column ,direction)
3 k `2 K* y8 D- @5 q, i

最后推荐的一个函数是tabulate,非常强的一个命令,可以实现对数据的统计分析,输出的结果有三列,分别是去重后的数据,出现的次数,已经对应的百分比

3 _6 Z- a- w ]* U

再结合sortrows对tabulate生成的结果进行排序,就很容易获得各个数据根据频率进行排序的结果

! z( M) k% H' | a- Q2 [, P" Y, t
& M( @( d- C# P# Z3 B

除了上面提到的几个日常比较常用的函数,还有一些我非常推荐的函数,平时我用的不太多,但是如果用到的时候找不到会很抓狂的那种

) v7 R9 c8 {1 r% ~9 {

比如reshape,可以根据自己的需求对数组进行重构

- z+ V0 Y/ z4 N1 x

isequal,可以用来确定两个数组是否相等

6 G( A6 I+ n* J! h [7 }8 V

datenum,datestr相信大家比较熟悉,可以将日期转换成序列值和字符,平时在处理时间相关数据的时候,还可以考虑用years,days,hours,minutes,seconds等等来计算持续时间

/ y7 f: d' i' \2 g

常用函数这部分内容就介绍到这,其实还有很多非常赞的函数,欢迎大家把自己喜欢的函数发到评论区

# U9 p0 X8 |8 k5 O7 q+ b0 Q# m8 Z5 |6 q0 Q$ X8 }: Y" H% x9 @

6. 数据爬取

8 L; j* c. V, } Q& X

数据爬取部分,其实我想讲的是爬虫,不过也不能算数据分析的技巧,我讲这部分内容,更多的是出于建模竞赛的原因

5 A& _2 y7 E; }* n) ^% [

建模、仿真和验证,其实是需要数据的支持的。脱离实际意义的建模,靠拍脑门做出来的结果,都是不提倡的

1 q- H3 ~7 Q0 K3 D* N7 q0 s; a$ Z+ V

最简单的情况,如果有现成的数据文件,可以根据今天聊到的第三部分,读取数据文件之后进行分析

: N5 Z3 ]5 C. W6 V6 y

如果没有这些数据,我推荐大家使用MATLAB读取网页的函数webread进行数据爬取

% K( Y# b2 I+ \9 ]5 U( E/ F
data = webread(url)
# b1 \- a& a' ~8 u" G2 Y

爬取到数据之后,再通过regexp函数正则法处理网页数据

) G# S$ i8 R$ g( O3 I3 ?

这部分聊的比较浅,但也很难三两句话把爬虫讲完,推荐大家一个相关的MATLAB爬虫视频,讲的是我之前用MATLAB爬取B站,视频很短,一共7分钟,大家一边看一边跟着做练习,基本上半个小时也就全整明白了(知乎不给放二维码,有需要的朋友,直接上B站搜打浦桥程序员吧)

1 T, m- F$ [% O

7. 薅系列工具

G& Q) k6 D: R5 f& j) H8 D0 l

最后一部分要安利给大家的是,由我自己开发的薅系列工具

! u) g" ]8 u* x! I9 Z2 D

目前反响最好的是薅曲线(HaoCurve),从图片中提取曲线的原始数据。之前不少参加过建模竞赛的朋友经常私信说,拿薅曲线来做结果验证特别管用

% G2 b+ H# j' z$ ^% j4 D

虽然这个工具我平时用到的不太多,不过就冲8000多的下载量来说,我还是很推荐的。需要的朋友,戳下方的文章链接获取工具下载方式

5 R( t) t$ v: X7 z7 X" O 1 G& ]& V+ f$ Y$ z
6 e. J' [ o6 N0 ^& J
' N: [/ I' e' o( N9 p* v2 E/ `
# G; `9 P! `6 V- g3 J3 k

我个人用的比较多的是另外两款工具,一个是薅文件(HaoFile),里面的历史代码检索功能很强大,可以大大减少找代码写脚本的时间,在数据分析过程中,很多脚本和功能都是可以复用的,有需要的朋友,戳下方的文章链接获取工具下载方式

- f# z- Q' c, _0 u , U7 K7 `. k9 i, i( T1 f

打浦桥程序员:背几段MATLAB代码就那么难吗?

/ ]5 z# S; t/ S/ Z # q6 ?/ _4 s, _ W n
6 ^' s0 W8 W, V& x+ `" n7 }
6 p* I- _/ h: q4 l, |, d
( _3 _* r, z/ M7 x1 j. i+ j3 p" W

另一款工具是薅模版(HaoTemplate),如果最终数据分析的交付文档有格式上的要求,薅模版能就发挥它的作用,可以生成特定格式的Excel或Word模版代码,这可比自己手动去调格式方便很多,有需要的朋友,戳下方的文章链接获取工具下载方式

7 u* o3 \5 k. L( C$ e$ A & F9 C, S2 J/ G; C" D# A* e9 T: A( ?
# Q0 P: T2 _6 S( K& J" \- O% X
$ r2 f' d6 X0 A1 l: Q6 h0 z
0 D+ E. E9 u. ?7 b7 D7 v

薅系列工具还有很多,不过在数据分析这部分,我最推荐的是这三款工具

" x7 G* c; l' q+ V$ V & ^1 R4 ?/ z8 ^* q& O9 s

不知觉间,写了这么多字

' |7 z. |) S, M6 D, E

今天总结的小技巧,未必是最适合大家的方法,但确实是我这些年养成的一些处理习惯

) w4 i- X! i: p1 b9 |/ X4 D5 z7 A

希望今天总结的方法,对大家平时的工作学习有所帮助,当然大家如果有更推荐的小技巧,欢迎在评论区补充

$ e( j6 J5 u* J/ B) r) n

如果你也对MATLAB感兴趣的话,欢迎关注我的微信公众号“打浦桥程序员”

# v0 ~: Y9 N# A- B . \6 W+ t( ?8 _7 P$ |( \, @ 1 X' r6 v) Z, m- k0 N* o% p , N; ~- x& \' w 5 t9 B! M ]+ r* b" K
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
三观道人
活跃在2026-4-6
快速回复 返回顶部 返回列表