一、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 56 7 8 9 10
或者用textread() 函数,加载数据到工作空间,需要注意加载数据的类型
>> a = textread('data2.txt')
a =1 2 3 4 56 7 8 9 10
如果数据不是规则的,则这两个函数的处理还是有差别的,textread()函数会自动对缺失的数据用0进行填补,而load函数直接报错;
>> a = load('data2.txt')
错误使用 load
ASCII 文件 data2.txt 的第 2 行中的列数必须与前面行中的列数相同。
>> a = textread('data2.txt')
a =1 2 34 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.1458589734751690.209023331509194 0.722841980854519 0.646446071734880 0.7180582712878980.609870564311474 0.828393537955305 0.991485577448960 0.2874756020793170.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 82 3 5 3 62 132 3 2 2 58 95 3 4 0 64 126 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:10str = ['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:nfilename = 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:nfileName = sprintf('book0%d.xls', k);myData{k} = xlsread(fileName, sheet, range);
end
celldisp(myData) % 显示细胞数组的数据
myData{1} =1 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1 1
myData{2} =2 2 22 2 22 2 22 2 22 2 22 2 22 2 22 2 22 2 2
myData{3} =3 3 33 3 33 3 33 3 33 3 33 3 33 3 33 3 33 3 3
myData{4} =4 4 44 4 44 4 44 4 44 4 44 4 44 4 44 4 44 4 4
myData{5} =5 5 55 5 55 5 55 5 55 5 55 5 55 5 55 5 55 5 5
例13、读入当前目录下所有后缀名为xls的Excel文件的数据。
clc,clear
fi = dir('*.xls'); % 提出Excel文件的信息,返回值是结构数据
n = length(fi); % 计算Excel文件的个数
myData = cell(1, n);
for k = 1:nmyData{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 =737538737539737540737541737542737543fts = 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.8868603816209180.4609995128875120.225644777870696-0.009709957146119-0.7265524767305680.090572270848305
例15、对于Matlab当前工作路径下所有时间序列型的纯文本文件,进行相关的数据操作。
clc,clear
tf = dir('*.txt') % 提出纯文本文件的信息,返回值是结构数据
n = length(tf); % 计算纯文本文件的个数
fts = ascii2fts(tf(1).name); % 读第一个文件中的时间序列数据
fts = extfield(fts, {'series2', 'series3'}); % 提出第二个字段和第三个字段
for i=2:ntp1 = 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:2000for m=1:12d = 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:na = 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.945333000000000CurrentTime: 0Tag: ''UserData: []视频属性:Width: 320Height: 176FrameRate: 25BitsPerPixel: 24VideoFormat: 'RGB24'
obj = VideoReader (具有属性):常规属性:Name: 'test.mp4'Path: 'D:\matlab_workspace\文件夹3\数据处理'Duration: 9.945333000000000CurrentTime: 0Tag: ''UserData: []视频属性:Width: 320Height: 176FrameRate: 25BitsPerPixel: 24VideoFormat: 'RGB24'