数据导入
在编写一个程序时,经常需要从外部导入数据,或者将程序运行的结果保存为文件。
一、save与load函数保存和加载程序数据
基本格式为:
save('FILENAME', 'VARIABLES')
load('FILENAME', 'VARIABLES')
例如,save ('datas.mat','data','x','y','z'); 表示将内存变量data, x, y, z 保存到当前路径下的datas.mat文件,其它程序若要载入这几个变量的数据,只需前面路径下执行load datas;即可。
例1:
x=[1:0.1:10];
y=sin(x);
save('test1.mat','x','y') %把变量x,y的内容保存到名为test1.mat的文件里(本目录下)
z=load('test1.mat') % 导入test1.mat,赋给z,其中z为struct结构数据类型
z.x
z.y
例2:
MATLAB存储文件有两种方式。一种是存储为 *.mat 格式, 一种为EXCEL。
save mydata1.mat
%将工作区所有的变数全部保存到名为mydata1的 *.mat 文件中,比ascii的格式要存储的内容要多
save mydata2.mat -ascii
%将工作区所有的变数全部保存到名为mydata1的 *.mat 文件中,并且以ASCII码的格式存储
save mydata1.mat, A
%将工作区中A这个变数存到mydata1.mat 文件中
load('mydata1.mat', ) %读取 mydata1.mat
load('mydata1.mat', '-ascii')
%如果 mydata1.mat是用 ASCII格式存储的,那么读取时要用这个格式
xlswrite('04.xlsx',M) %将变数M存到04.xlsx
xlswrite('D:\04.xlsx',M) %将变数M存到04.xlsx,位置放到D盘
xlswrite('04.xlsx',M,1,'E2:E4') % 将娈数M放到04.xlsx的SHEET1,位置为E2:E4
xlswrite('04.xlsx',{'Mean'},1,'E1') % 将字符串 Mean 放到04.xlsx的SHEET1,位置为E1
xlsread('04Score.xlsx') %读取04Score.xlsx
xlsread('04Score.xlsx','B2:D4') %读取04Score.xlsx的B2:D4
[Score Header] = xlsread('04.xlsx') %可以看到所有的数据都放到Score,所有的标题放到 Header
二、txt文件的导入导出
1. 导入格式一致的数据
例1 现有txt文件如下:
![](https://pic3.zhimg.com/80/v2-1ba9b2388735515fcb58d65a084dd2ea_720w.png)
![](https://pic4.zhimg.com/80/v2-6303affc6f236333721d32a9a4383b87_720w.png)
代码:
x1=load('data1.txt'); %注意设置当前路径为文件所在路径
x2=load('data2.txt');
2. 导入有固定分隔符的数据
dlmread('FILENAME', '分隔符', '读取范围')
例2读取txt文件如下(需要跳过前2行的非数据行,或列数不同):
![](https://pic1.zhimg.com/80/v2-c20ad9fd1d4be665b8e9dac64f56971c_720w.png)
![](https://pic2.zhimg.com/80/v2-ca7d7b6e3e9f50775c0113286a352a0d_720w.png)
代码:
x3=dlmread('data3.txt', ',', 2,0) ; %设定读取的初始位置:2行0列之后的数据
x4=dlmread('data4.txt'); %列数不足用0不齐,load函数读取将报错
3. 将矩阵数据写入指定分隔符的ASCII格式文件
dlmwrite(‘文件名’, ‘数据’, ‘分隔符’, ‘起始行’, ‘起始列’)
dlmwrite(‘文件名’, ‘数据’, '-append')
'-append'表示将矩阵数据写到文本末尾,若不指定将覆盖原文本数据。
4. 导入带表头的txt或excel数据
importdata函数允许加载不同格式的各种数据文件。它有以下五种形式 :
序号 | 函数 | 描述 |
---|---|---|
1 | A = importdata(filename) | 从文件filename中将数据加载到数组A中。 |
2 | A = importdata('-pastespecial') | 从系统剪贴板而不是从文件加载数据。 |
3 | A = importdata(___, delimiterIn) | 解析delimiterIn 作为在ASCII 文件,文件名或剪贴板数据中的列分隔符。可以使用delimiterIn 与上述语法中的任何输入参数。 |
4 | A = importdata(___, delimiterIn, headerlinesIn) | 从ASCII文件,文件名或剪贴板加载数据,从行头标题In + 1 开始读取数字数据。 |
5 | [A, delimiterOut, headerlinesOut] = importdata(___) | 返回在delimiterOut 中检测到的输入ASCII文件的分隔符字符,并使用前面语法中的任何输入参数检测headerlinesOut 中检测到的标题行数。 |
importdata(‘文件名’, ‘分隔符’, ‘n’) 将数据存入“结构体”,其中,n表示n行表头;也可以用来读入图片:
x=importdata('tupian.jpg'); image(x);
例3 读入如下的txt文件:
![](https://pic1.zhimg.com/80/v2-cb5504fa7be1f4bf6e1eea80c1756f60_720w.png)
代码:
x5=importdata('data5.txt',' ',1); %空格分隔, 第1行是表头
x5.data %数据
x5.textdata %表头变量
再比如:
filename = 'mydog.jpg';
A = importdata(filename);
image(A);
运行文件时,MATLAB显示图像文件。但是,必须将其存储在当前工作目录(F:\worksp\matlab)中
5. 导入混合格式文本
textscan(fid, 'format', N, 'param', value);
其中,fid为文件句柄;format为读取格式;N表示用该格式读取N次数据;'param', value(可选项)指定分隔符和值对。
注意:使用textscan之前,必须先用fopen打开要读入的文件;函数textread用法类似。
例4 混合格式数据的txt文件如下:
![](https://pic2.zhimg.com/80/v2-0eb041a189a0dc208e6171094d3fb789_720w.png)
![](https://pic1.zhimg.com/80/v2-c07b59a149e15ddb7c7b53297d24e7d0_720w.png)
代码:
fid=fopen('data6.txt','r'); %打开文件句柄
C=textscan(fid, '%s%s%f32%d8%u%f%f%s%f'); %按格式读入元胞数组C
fclose(fid); %关闭文件句柄
C{1}
C{9}
[names,types,y,answer]=textread('data7.txt','%9c %6s %*f %2d %3s', 1) %读入固定格式的文件的第一行,忽略其中的浮点值
运行结果:C{1} = 'Sally' 'Joe' 'Bill'
C{9} = 5.1000 + 3.0000i 2.2000 - 0.5000i 3.1000 + 0.1000i
names = Sally Lev
types = 'el1'
y = 45
answer = 'Yes'
三、csv文件导入与导出
csv文件是逗号分隔的txt文件,使用csvread( ) 函数,有3种格式:
csvread( 'filename', row, col, range)
其中,第一个参数指定文件名;
row和col指定开始读取位置的行号和列号。注意是从0开始计数,即row=0, col=0表示从文件中第一个数(1, 1)开始读;
range指定读取的范围,range=[R1 C1 R2 C2],表示读取区域的左上角位置为(R1+1, C1+1),读取区域的右下角位置为(R2-1, C2-1),且要求row, col等于R1, C1.
注意:csv文件中的空项,读到矩阵中时,会初始化为0.
四、 Excel文件的导入与导出
1. 导入Excel数据文件
[num, txt, raw] = xlsread('文件名.xls','工作表', '数据范围')
例
![](https://pic4.zhimg.com/80/v2-f60c767137fbfd59aa03781a48893cc7_720w.jpg)
num=xlsread('data1.xlsx','Sheet1','A1:E13');
input_train=num(1:8,1:4)';
output_train=num(1:8,5)';
input_test=num(9:13,1:4)';
output_test=num(9:13,5)';
其中,num:只是一个定义的名称而已,你可以把他定义成你所想想要的名称即可,比如:settlement;data1:是你自己给这个excel起的名字;xlsx:这是excel的文件后缀,如果你是更早的版本可能是xls,注意甄别即可;Sheet1:这个是你的数据在excel的第几页里面;A1:E13:这个是你的数据在excel所处的全部范围。num(1:8,1:4):1:8的意思是第一行到第八行,1:4是第一列到第四列,下面的以此类推。
例:现有data1.xlsx文件(导入Sheet1的A1至H4数据):
![](https://pic4.zhimg.com/80/v2-06abb59a28d752f24d04764dfd0911f7_720w.png)
代码:
[num,txt,raw]=xlsread('data1.xlsx','Sheet1','A1:H4')
%数据返回num;文本返回txt;不处理直接作为元胞返回raw
运行结果:
num =
1 60101 6010101 NaN 0 63 63
2 60101 6010102 NaN 0 73 73
3 60101 6010103 NaN 0 0 0
txt =
'序号' '班名' '学号' '姓名' '平时成绩' '期末成绩' '总成绩' '备注'
'' '' '' '陈亮' '' '' '' ''
'' '' '' '李旭' '' '' '' ''
'' '' '' '刘鹏飞' '' '' '' '缺考'
raw =
'序号' '班名' '学号' '姓名' '平时成绩' '期末成绩' '总成绩' '备注'
[ 1] [60101] [6010101] '陈亮' [ 0] [ 63] [ 63] [ NaN]
[ 2] [60101] [6010102] '李旭' [ 0] [ 73] [ 73] [ NaN]
[ 3] [60101] [6010103] '刘鹏飞' [ 0] [ 0] [ 0] '缺考'
2. 将数据导出到Excel文件
status = xlswrite(‘filename.xls’, ‘数据’, ‘工作表’, ‘指定区域’)
成功返回1,失败返回0.
例6 将矩阵或元胞数组的数据写成xls文件
代码:
A=[12.7 5.02 -98 12; 63.9 0 -0.2 56];
xlswrite('testdata.xls', A)
d={'Time', 'Temp'; 12 98; 13 99; 14 97};
s=xlswrite('tempdata.xls', d, 'Temperatures', 'E1')
%将数据d写入文件tempdata.xls, Temperatures表,E1起始
例7 读取数据、处理日期数据,根据日期绘制开盘价变化趋势图形。ExpData.xlsx文件如下(部分):
![](https://pic2.zhimg.com/80/v2-b0798c89a5f0b8730a485f5d03f654b5_720w.png)
代码:
[num,txt]=xlsread('ExpData.xlsx');
%读取excel表格中的数据,数值存入num,文本存入txt
date=txt(2:end,1); %取出日期数据单独处理
t=datenum(date); %将日期转化为数值(方便绘图使用)
date1=datestr(t); %将数值转化为日期
h=figure %生成空的图形窗口句柄
set(h,'color','w'); %将图的背景颜色设为白色
plot(t,num(:,1)); %以日期为横坐标,开盘价为纵坐标,绘制图形
%plot(t,num(:,1),'*'); %绘制散点图
datetick('x',23); %将x轴标注变成日期格式:mm/dd/yyyy
xlabel('日期');
ylabel('开盘价');
运行结果:
五、 .mat文件
mat文件是matlab的数据存储的标准格式。mat文件是标准的二进制文件,还可以ASCII码形式保存和加载,在MATLAB中打开显示类似于单行EXCEL表格。
load 打开mat文件
save 关闭\保存mat文件
load('filename','X','Y','Z') 加载filename文件中的X Y Z变量到工作区间中
save('filename','-struct','s') 保存结构体s 到filename中
具体操作:
如:在命令行窗口中输入a=[1 2 3 4 5 6],按回车键之后,输入save a,将a变量保存在新生成的a.mat文件,如下图所示:
2
第二步按回车键之后,在当前文件夹中,可以看到新生成的a.mat文件,需要注意的是在保存数据到mat文件中的时候,可以设置mat文件名,保存的变量,保存的路径,如下图所示:
3
第三步使用“load a”,读取a.mat文件数据,读取之后,就可以直接使用mat文件里面的a变量,如下图所示:
4
第四步如果我们想保存多个变量到mat文件中,可以通过save('data.mat','a','b')的方式,data.mat是生成的mat文件名,a和b是存入的变量,如下图所示:
5
第五步使用load('data.mat')读取mat文件,读取之后,可以直接使用a和b变量,如下图所示:
=======================================
=======================================
(1)matlab中dir()函数
matlab中使用dir()函数获得指定文件夹下的所有子文件夹和文件,并存放在一种文件结构体数组中。
dir()函数的调用方式有三种,分别为:
1、dir('.') 列出当前目录下所有子文件夹和文件
2、dir('E:\Matlab') 列出指定目录下所有子文件夹和文件
3、dir(E:\Matlab,'*.bmp') 列出指定目录下后缀为.bmp的文件
举个例子,批量读取文件,
file=dir('F:\cabspottingdata\cabspottingdata\*.txt');
for n=1:length(file);
D{n,1}=importdata(['F:\cabspottingdata\cabspottingdata\',file(n).name]);
end
%比如要获得某一路径下所有后缀为.3gp的文件个数:
D1=dir(fullfile(filedir,'*.3gp'));
filename={D1.name}'; %name要进行转置
precount=size(filename,1);
%比如要获得训练图片
cd('C:\训练\');
file=dir('C:\训练\*.jpg');
[k len]=size(file);
for i=1:k
name=file(i).name;
I=imread(name);
figure(i);
imshow(I);
end
(2)matlab中fullfile()函数
f = fullfile('dir1', 'dir2', ..., 'filename') %fullfile构成地址字符串;
如:输入:f = fullfile('C:','Applications','matlab','fun.m')
得到:f =C:\Applications\matlab\fun.m
%下例为读取train文件夹中的所有图片;
folder=‘train';
filepaths = dir(fullfile(folder,'*.bmp'));%列出该文件夹下所有.bmp格式的文件(其中包括文件的名字、日期、像素等);
for i = 1 : length(filepaths)
image = imread(fullfile(folder,filepaths(i).name));%读入第i个图片;
image = rgb2ycbcr(image);
image = im2double(image(:, :, 1));%获得图像的y通道;
im_label = modcrop(image, scale);%保证图像被scale整除;
[hei,wid] = size(im_label);
im_input = imresize(imresize(im_label,1/scale,'bicubic'),[hei,wid],'bicubic');%对图像用'bicubic'先下采样再上采样;
%提取数据;
for x = 1 : stride : hei-size_input+1
for y = 1 :stride : wid-size_input+1
subim_input = im_input(x : x+size_input-1, y : y+size_input-1);%子图像尺寸33*33;
subim_label = im_label(x+padding : x+padding+size_label-1, y+padding : y+padding+size_label-1);%子图像类别尺寸21*21;
%subim_input和subim_label的中心一致;
count=count+1;
data(:, :, 1, count) = subim_input;
label(:, :, 1, count) = subim_label;
end
end
end
%遍历文件夹中指定类型的文件
path = 'G:\testImg\';
fileExt = '*.bmp';
files = dir(fullfile(path,fileExt));
len = size(files,1);
for i=1:len
fileName = strcat(path,files(i,1).name),
end;