一、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'