MATLAB(六)数据处理

一、Matlab中的默认数据文件mat文件

例1、把Matlab工作空间中的数据矩阵a、b、c保存到数据文件data1.mat中。

>> a = [1, 2, 3]
a =
     1     2     3
>> b = [4, 5, 6]
b =
     4     5     6
>> c = [7, 8, 9]
c =
     7     8     9
>> save data1 a b c

例2、把例1生成的data1.mat中的所有数据加载到Matlab工作空间中。

>> load('data1.mat')

二、纯文本文件

可以把word文档中整行整列的数据粘贴到纯文本文件,然后调入到Matlab工作空间中。

例3、把纯文本文件data2.txt加载到工作空间。

>> a = load('data2.txt')
a =
     1     2     3     4     5
     6     7     8     9    10

或者用textread() 函数,加载数据到工作空间,需要注意加载数据的类型

>> a = textread('data2.txt')
a =
     1     2     3     4     5
     6     7     8     9    10

如果数据不是规则的,则这两个函数的处理还是有差别的,textread()函数会自动对缺失的数据用0进行填补,而load函数直接报错;

>> a = load('data2.txt')
错误使用 load
ASCII 文件 data2.txt 的第 2 行中的列数必须与前面行中的列数相同。 
>> a = textread('data2.txt')
a =
     1     2     3
     4     5     0

例4、使用dlmwrite命令把矩阵b保存到纯文本文件data3.txt中。

>> b = [1 2 3]
b =
     1     2     3
>> dlmwrite('data3.txt', b)

例5、生成服从标准正太分布随机数的100x200矩阵,然后用fprintf命令保存到纯文本文件data4.txt中。

clc, clear
fid = fopen('data4.txt', 'w');
a = normrnd(0, 1, 100, 200); %0,1表示的是随机数的取值范围
fprintf(fid, '%f\n', a'); % 将产生的数据a保存到打开的data4.txt文件中
fclose(fid); % 关闭data4.txt文件

 

注:对于高维矩阵用dlmwrite构造的纯文本文件,Lingo软件不识别;为了Lingo软件识别,纯文本文件必须用fprintf构造,而且数据之间的分割符为“\n”。

三、Excel文件

例6、把一个5x10矩阵写到Excel文件data5.xls表单Sheet2中B2开始的域中。

clc, clear
a = rand(5, 10);
xlswrite('data5.xls', a, 'Sheet2', 'B2')

例7、把例6生成的Excel文件data5.xls中表单Sheet2的域“C3:F6”中的数据赋值给b。

>> b = xlsread('data5.xls', 'Sheet2', 'C3:F6')
b =
   0.231662966604022   0.989774818941714   0.782489349911504   0.145858973475169
   0.209023331509194   0.722841980854519   0.646446071734880   0.718058271287898
   0.609870564311474   0.828393537955305   0.991485577448960   0.287475602079317
   0.612317772839133   0.365553588875753   0.775034954080905   0.603066961251474

四、字符串数据

例8、统计下列五行字符串中字符a、c、g、t出现的频数。

clc, clear
fid = fopen('data6.txt', 'r');
i = 1;
while(~feof(fid))
    data = fgetl(fid);
    a = sum(data == 97);
    b = sum(data == 99);
    c = sum(data == 103);
    d = sum(data == 116);
    e = sum(data >= 97 & data <= 122);
    f(i, :) = [a b c d e a+b+c+d];
    i = i + 1;
end
f
he = sum(f)
fclose(fid);
f =
     2     0     5     1    65     8
     2     3     5     3    62    13
     2     3     2     2    58     9
     5     3     4     0    64    12
     6     5     2     3    63    16
he =
    17    14    18     9   312    58

其他的一些字符串处理命令有strcmp、strfind等。

五、图像文件

例9、把一个比较大的bmp图像文件data7.bmp,转化成比较小的jpg文件,命名为data7.jpg,并显示。

clc,clear
a = imread('data7.bmp');
imshow(a)
imwrite(a, 'data7.jpg');
figure
imshow('data7.jpg')

 例10、生成10幅彩色jpg文件,依次命名为jpg1.jpg,......,jpg10.jpg。

clc,clear
for i = 1:10
    str = ['jpg', int2str(i), '.jpg'];
    a(:,:,1) = rand(500);
    a(:,:,2) = rand(500) + 100;
    a(:,:,3) = rand(500) + 200;
    imwrite(a, str);
end

六、数据的批处理

例11、现有数据文件book1.xls,......,book5.xls,用命令importdata读入数据。

clc,clear
n = 5;
mydata = cell(1, n);
for k = 1:n
    filename = sprintf('book%d.xlsx', k); % 构造文件名的格式化字符串
    mydata{k} = importdata(filename); % 从文件导入数据
end
celldisp(mydata) % 显示细胞数据的数据

注意:xls文件必须是微软office创建的文件,否则,读取文件时会出现错误。 

mydata{1} =
          data: [1×1 struct]
      textdata: [1×1 struct]
    rowheaders: [1×1 struct]
mydata{2} =
          data: [1×1 struct]
      textdata: [1×1 struct]
    rowheaders: [1×1 struct]
mydata{3} =
          data: [1×1 struct]
      textdata: [1×1 struct]
    rowheaders: [1×1 struct]
mydata{4} =
    Sheet1: {'8iiy8u'}
mydata{5} =
    Sheet1: {'uykyu'  'j546'}

例12、现有数据文件book01.xls,...,book05.xls,读取各Excel文件的第1个表单(Sheet1)的域“A2:C10”的数据。

clc,clear
n = 5;
range = 'A2:C10';
sheet = 1;
myData = cell(1, n);
for k=1:n
    fileName = sprintf('book0%d.xls', k);
    myData{k} = xlsread(fileName, sheet, range);
end
celldisp(myData) % 显示细胞数组的数据
myData{1} =
     1     1     1
     1     1     1
     1     1     1
     1     1     1
     1     1     1
     1     1     1
     1     1     1
     1     1     1
     1     1     1
myData{2} =
     2     2     2
     2     2     2
     2     2     2
     2     2     2
     2     2     2
     2     2     2
     2     2     2
     2     2     2
     2     2     2
myData{3} =
     3     3     3
     3     3     3
     3     3     3
     3     3     3
     3     3     3
     3     3     3
     3     3     3
     3     3     3
     3     3     3
myData{4} =
     4     4     4
     4     4     4
     4     4     4
     4     4     4
     4     4     4
     4     4     4
     4     4     4
     4     4     4
     4     4     4
myData{5} =
     5     5     5
     5     5     5
     5     5     5
     5     5     5
     5     5     5
     5     5     5
     5     5     5
     5     5     5
     5     5     5

例13、读入当前目录下所有后缀名为xls的Excel文件的数据。

clc,clear
fi = dir('*.xls'); % 提出Excel文件的信息,返回值是结构数据
n = length(fi); % 计算Excel文件的个数
myData = cell(1, n);
for k = 1:n
    myData{k} = importdata(fi(k).name);
end
celldisp(myData) % 显示细胞数组的数据
myData{1} =
    Sheet1: [9×3 double]
myData{2} =
    Sheet1: [9×3 double]
myData{3} =
    Sheet1: [9×3 double]
myData{4} =
    Sheet1: [9×3 double]
myData{5} =
    Sheet1: [9×3 double]
myData{6} =
          data: [1×1 struct]
      textdata: [1×1 struct]
    rowheaders: [1×1 struct]
myData{7} =
          data: [1×1 struct]
      textdata: [1×1 struct]
    rowheaders: [1×1 struct]
myData{8} =
          data: [1×1 struct]
      textdata: [1×1 struct]
    rowheaders: [1×1 struct]
myData{9} =
    Sheet1: {'8iiy8u'}
myData{10} =
    Sheet1: {'uykyu'  'j546'}
myData{11} =
    Sheet2: [5×10 double]

七、时间序列数据

例14、时间序列数据的处理

clc,clear
randn('seed', sum(100*clock)); % 初始化随机数发生器
a = randn(6, 1); % 生成服从标准正太分布的伪随机数
b = [today:today+5]' % 从今天到后面5天
fts = fints(b,a) % 生成fints格式数据
fts(3) = NaN; % 将第三个数据变为缺失值
newdata = fillts(fts, 'linear') % 用线性插值填补时间序列中的缺失数据
data = fts2mat(newdata) % 时间序列数据转为普通数据
b =
      737538
      737539
      737540
      737541
      737542
      737543
 
fts = 
 
    desc:  (none)
    freq:  Unknown (0)

    'dates:  (6)'    'series1:  (6)'     
    '23-Apr-2019'    [ 0.886860381620918]
    '24-Apr-2019'    [ 0.460999512887512]
    '25-Apr-2019'    [-0.215670586672620]
    '26-Apr-2019'    [-0.009709957146119]
    '27-Apr-2019'    [-0.726552476730568]
    '28-Apr-2019'    [ 0.090572270848305]
 
newdata = 
 
    desc:  Filled 
    freq:  Unknown (0)

    'dates:  (6)'    'series1:  (6)'     
    '23-Apr-2019'    [ 0.886860381620918]
    '24-Apr-2019'    [ 0.460999512887512]
    '25-Apr-2019'    [ 0.225644777870696]
    '26-Apr-2019'    [-0.009709957146119]
    '27-Apr-2019'    [-0.726552476730568]
    '28-Apr-2019'    [ 0.090572270848305]
data =
   0.886860381620918
   0.460999512887512
   0.225644777870696
  -0.009709957146119
  -0.726552476730568
   0.090572270848305

例15、对于Matlab当前工作路径下所有时间序列型的纯文本文件,进行相关的数据操作。

clc,clear
tf = dir('*.txt') % 提出纯文本文件的信息,返回值是结构数据
n = length(tf); % 计算纯文本文件的个数
fts = ascii2fts(tf(1).name); % 读第一个文件中的时间序列数据
fts = extfield(fts, {'series2', 'series3'}); % 提出第二个字段和第三个字段
for i=2:n
    tp1 = ascii2fts(tf(i).name); % 读取时间序列数据
    tp2 = extfield(fts, {'series2', 'series3'}); % 提出第2,3字段
    str1 = ['series', num2str(2*i)];
    str2 = ['series', num2str(2*i+1)];
    tp3 = fints(tp2.dates, fts2mat(tp2), {str1,str2}); % 把时间序列改名
    fts = merge(fts, tp3); % 合并两个时间序列的数据
end
fts % 显示合并提出的两个字段数据

八、日期和时间

Matlab日期和时间的函数有datenum,datevec,datestr,now,clock,date,calendar,eomday,weekday,addtodate,etime等,这里就不一一说明各个函数的用法了,下面举例说明有关函数的使用。

例16、统计1601年1月到2000年12月,每月的13日分别出现在星期日、星期一、星期二,...,星期六的频数,并画出对应的柱状图。注:Matlab中weekday的1对应“星期日”,2对应“星期一”,......,7对应“星期六”。

clc,clear
c = zeros(1,7);
for y=1601:2000
    for m=1:12
        d = datenum(y, m, 13);
        w = weekday(d);
        c(w) = c(w) + 1;
    end
end
c,bar(c) %显示频数并画出频数的柱状图
axis([0 8 680 690])
line([0, 8], [4800/7, 4800/7], 'linewidth', 4, 'color', 'k')
set(gca, 'xticklabel', {'Su', 'M', 'Tu', 'W', 'Th', 'F', 'Sa'})
c =
   687   685   685   687   684   688   684

九、视频文件

        Matlab除了支持各种图像文件的读写等操作,还支持视频文件的相应处理。实际上,视频文件本质上是由多帧具有一定大小、顺序、格式的图像组成的,只是一般的图像是静止的,而视频是可以将多帧静止的图像进行连续显示,从而达到动态效果。

例17、读取一个视频文件text.mp4,并把视频中的每一帧保存成jpg文件。

clc,clear
ob = VideoReader('test.mp4')  % 读取视频文件对象
get(ob) % 获取视频对象的参数
n = ob.NumberOfFrame; % 获取视频的总帧数
for i = 1:n
    a = read(ob, i); % 读取视频对象的第i帧
    imshow(a)  % 显示第i帧图像
    str = ['source\', int2str(i), '.jpg']; % 构造文件名的字符串,目录source要提前建好
    imwrite(a, str); % 把第i帧保存到jpg文件
end
ob = 
  VideoReader (具有属性):

   常规属性:
            Name: 'test.mp4'
            Path: 'D:\matlab_workspace\文件夹3\数据处理'
        Duration: 9.945333000000000
     CurrentTime: 0
             Tag: ''
        UserData: []
   视频属性:
           Width: 320
          Height: 176
       FrameRate: 25
    BitsPerPixel: 24
     VideoFormat: 'RGB24'
obj = 
  VideoReader (具有属性):

   常规属性:
            Name: 'test.mp4'
            Path: 'D:\matlab_workspace\文件夹3\数据处理'
        Duration: 9.945333000000000
     CurrentTime: 0
             Tag: ''
        UserData: []
   视频属性:
           Width: 320
          Height: 176
       FrameRate: 25
    BitsPerPixel: 24
     VideoFormat: 'RGB24'

 

 

  • 7
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值