数据提取往往是写程序的第一步,这里我主要总结了文本的数据(中英字符+数字)提取,并简单介绍一下excel、图片、视频的读入函数;
每个函数我都会举一些比较有代表性的例子,尽量写的通俗易懂,手机看的话可能会有排版问题,见谅;
每个函数都有很多使用细节,这里只举主要参数,其他参数可以看该函数的doc或者我上一个帖子分享的两本书http://muchong.com/bbs/viewthread.php?tid=9708948;
总结不到位或者错漏欢迎指正,大家一起学习,还有金币拿~
1、读取文本数据(格式一般为txt、mat、dat);下面各函数强大程度按顺序增加(主观排序,具体问题具体分析);
1)load(filename),适用类型:文本时纯数字数据,而且各行列数相等(每一行数据个数相等,下面不再解释);
如1 2 3 OK;
若L 2 3 NO;(有英文字符);
如1 2 3
4 5 6 OK;
若1 2
4 5 6 NO;(各行列数不相等);
2)csvread(filename),适用类型:文本是纯数字数据,而且数据间用逗号隔开;与load相比进步在:若每行数据个数不等,少的会自动补充为0;
如1,2,3 OK;
若1 2 3 NO;(间隔不是逗号);
若L,2,3 NO;(有英文字符);
如1,2,3
4,5 OK;(会输出[1 2 3;4 5 0]的矩阵);
3)dlmread(filename,delimiter),适用类型:文本是纯数字数据;与csvread相比进步在:对间隔符没有相求,delimiter用来指定间隔符(下面有说);
如1 2 3 OK;
如1,2,3 OK;
文本中依然不能出现中英字符,不再举例;
接下来介绍两个比较高级的函数,这两个函数使用起来参数要求很严格,开始用容易出错,熟练使用可以解决很多问题;
4)[a b c d]=textread(filename,format,'delimiter',',','headerlines',2),适用类型:使用得当可以处理大部分文本(中英字符+数字数据);
filename文件名;
format指数据格式,%s字符;%d整数;%g浮点数,个数要与输出相等,比如'%s%d%g'有3个,那么输出一定是[a,b,c]也是3个,保证一致;
(详细可看help textread;或者看我上一个帖子推荐的书《MATLAB编程第二版》http://muchong.com/bbs/viewthread.php?tid=9708948);
delimiter设置分隔符,如''表示空格,','表示逗号;
headerlines设置读取数据的起始行,2代表从第三行开始读;(0,1,2所以是第三行)
注:textread是将数据一列列读取的,所以对于处理各行列数相等的文本比较有优势;
5)C=textscan(fid,format),适用类型:与textread类似,区别是textscan将结果保存到C这个单元数组(cell);
fid:仔细的同学可以看出其他函数都是filename,只有textscan不一样,所以用textscan函数之前要用fid=fopen(filename);
format,delimiter,headerlines使用方法与textscan一致;
举一个很经典的例子,下面是一个17*8的矩阵(需要提取右边14*6的数据矩阵),‘1.txt’文本如下
5 jhg jy jyg jh kjh jh kjh
yuyu yu yt uyt uyt uyt uyt uyt
fh jhg jy jyg jh kjh jh kjh
kjh kjh 56 56 21 654 54 354
jh jh 54 6456 654 46 5 21
kjh kjh 12 56 54 -562 21 21
kjh kjh 321 412 654 54 4 23
kjh kjh 646 545 1254 54 21 1
kjh kjh 4 545 632 1 38 32
kjh kjh 21 3 -15 6554 55 63
kjh kjh 21 21 1 13107 3 94
kjh kjh 5 21 2 19660 45 125
kjh kjh 1 3 3 26213 52423 156
kjh kjh -639 -15 4 2 0 187
kjh kjh -319 2 21 21 21 218
kjh kjh 1 2 21 23 25 249
kjh kjh 321 321 21 23 25 280
方法一:(这是网上一个帖子的解法,用的textscan,http://www.cnblogs.com/ShaneZhang/archive/2013/05/20/3088834.html,下面我还会给一个非常简单的方法)
clc;clear;close all;
hang=[4 17];%4行到17行。这样你也可以变化
lie=[3 8];%3到8列。这样你也可以变化
[FileName,PathName] = uigetfile('*.txt','Select the Txt files');%弹出对话框,然后选择你要处理的文件
fid=fopen([PathName FileName]);%载入文件
temp=textscan(fid,'%s %s %s %s %s %s %s %s'); %将文本读取到temp这个单元矩阵(1*8cell,因为是8列);
fclose(fid);
for i=1 hang(2)-hang(1)+1) %这个循环就是从temp单元矩阵中把数据分出来;
for j=1 lie(2)-lie(1)+1)
b=temp{j+lie(1)-1}{i+hang(1)-1};
A(i,j)=str2num(b); %14*6的数据矩阵放入A中;
end
end
注:textread和textscan都是按列读取数据;功能强大但是需熟悉函数用法;
6)importdata(filename)【个人认为很强大很简便的一个函数】
使用类型:文本可以是中英字符+数字数据,各行列数相等;(需要提取的数据最好在一块)
还是刚才的例子,17*8的文本中提取14*6的数据矩阵(假设文件名'1.txt');
方法二:直接用A=importdata('1.txt');得到的A.data就是需要提取的14*6的数据矩阵(一句话就搞定了,是不是很简单)
********************************************************************************************
总结:提取文本的函数主要就这些,使用时还得具体问题具体分析,下面提供一个简单思路;
*纯数据:load,csvread,dlmread,importdata;
*中文字符加数据(各行列数相等,目标数据在一块):importdata;
*中文字符加数据(内容复杂,输出要求较高):textread,textscan;
*中文字符加数据(特别复杂):引入strcmp等函数进行判断筛选;
附件给了一个很经典的例子(2007年的数模题,对数据提取要求很高,我把程序调试了一下,有兴趣的可以看看)
2、excel数据提取;
A= xlsread(filename,sheet,range);
sheet选定工作表;range选定读取行列数;
3、图片数据提取;
A=imread(filename);%imread可将图片直接读取成数据;
imshow(filename);%可直接显示出图片,也可将filename换成数组;
4、视频数据提取;
obj=VideoReader(filename);%提取视频,能处理大部分视频格式(如avi,wmv,mp4,mpg,mov等)
下面举一个例子(改程序):
obj=VideoReader('MVI_0703.MOV');
numframes=obj.NumberofFrames;
for k=150:200 %提取第四秒
frame=read(obj,k);
imwrite(frame,strcat(int2str(k),'.jpg'),'jpg');%保存为jpg格式照片
end
这个程序将视频MVI_0703.MOV读取出来,因为视频其实就是许多帧图片合在一起,假设每秒50帧,这里将第4秒(150-200)视频转化成图片保存下来;
再给大家推荐两个网址:
http://www.ilovematlab.cn/thread-872-1-1.html
http://www.cnblogs.com/ShaneZhang/archive/2013/05/20/3088834.html
这两个帖子是网上找的,都是讲文本数据提取的,讲的比我专业;希望大家一起进步。 |