0%

MATLAB 数据储存与调用

MATLAB 编程过程中会产生很多数据,暂时储存在 Matlab 的右侧工作区中,这些数据可以复制、剪切,也可以保存在 mat 文件、dat 文件、txt 文件或 Excel 文件中。

在编程过程中,要养成保存数据 (有用的数据) 的习惯,特别是非常运行时间比较长的程序。做完图就把数据丢了的做法是非常不明智的。

mat 文件

储存数据

  • 点击菜单 保存工作区 (Save Workspace) 就可以把工作区的所有数据保存到一个 mat 文件;
  • 命令行输入 save datasave data.mat 把工作区所有数据保存到 data.mat 文件;
  • 命令行输入 save data Asave data.mat A 把工作区中 A 矩阵保存到 data.mat 文件。
1
2
3
clear; a = magic(4);
save data1.mat
save data2.mat -ascii % 文本编辑器打开不会乱码

加载数据

  • 双击 mat 文件即可加载其中的数据;
  • 命令行输入 load('data.mat')load('data.mat','A') 可以加载 data.mat 中的数据。
1
2
load('data1.mat')
load('data2.mat','-ascii')

dat 文件保存与 mat 类似,保存或加载是必须加后缀 .dat,比如 data.dat.

Excel 文件

从 Excel 文件读取数据

matlab-excel.png

1
2
3
4
5
>> Score = xlsread('Score.xlsx')
Score =
94 83 89
76 88 82
68 72 75
1
2
3
4
5
Score = xlsread('Score.xlsx', 'B2:D4')
Score =
94 83 89
76 88 82
68 72 75

Excel 文件数据写入

1
2
3
M = mean(Score')';
xlswrite('Score.xlsx', M, 1, 'E2:E4');
xlswrite('Score.xlsx', {'Mean'}, 1, 'E1');

matlab-excel2.png

示例:

1
2
3
4
5
6
7
8
9
10
% 建立Excel并输入数据
% values = {1, 2, 3 ; 4, 5, 'x' ; 7, 8, 9};
values = [1, 2, 3 ; 4, 5, 6 ; 7, 8, 9];
headers = {'First','Second','Third'};
xlswrite('data.xlsx', [headers; values]);

% 读取Excel数据
filename = 'data.xlsx';
A = xlsread(filename)
subsetA = xlsread('data', 'B2:C3')

文件输入与输出

fopen 函数

  • fopen 函数用来打开文件以供读取,其调用格式
1
fid = fopen (filename, permission)

permission:

'r' 打开要读取的文件。
'w' 打开或创建要写入的新文件。放弃现有内容(如果有)。
'a' 打开或创建要写入的新文件。追加数据到文件末尾。
'r+' 打开要读写的文件。
'w+' 打开或创建要读写的新文件。放弃现有内容(如果有)。
'a+'打开或创建要读写的新文件。追加数据到文件末尾。

fclose 函数

  • fclose 函数用于关闭已打开的文件,其调用格式
1
status = fclose(fid)
1
2
3
4
5
6
7
8
x = 0:pi/10:pi;
y = sin(x);
fid = fopen('sinx.txt','w');
for i=1:11
fprintf(fid,'%5.3f %8.4f\n', x(i), y(i));
end
fclose(fid);
type sinx.txt

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
>> text01

0.000 0.0000
0.314 0.3090
0.628 0.5878
0.942 0.8090
1.257 0.9511
1.571 1.0000
1.885 0.9511
2.199 0.8090
2.513 0.5878
2.827 0.3090
3.142 0.0000

fscanf 函数

1
A = fscanf(fid, format, sizeA);

将文件数据读取到维度为 sizeA 的数组 A 中,并将文件指针定位到最后读取的值之后。fscanf 按列顺序填充 AsizeA 必须为正整数或采用 [m n] 的形式,其中 mn 为正整数。

fprintf 函数

1
fprintf(fid, format, x, y,...);

按列顺序将 format 应用于数组 x, y ,... 的所有元素,并将数据写入到一个文本文件。fprintf 使用在对 fopen 的调用中指定的编码方案。

asciiData.txt

1
2
3
John 1995 12 5 12.3 3.24
Tom 1995 12 7 2.3 2.0
Jean 1996 3 2 10.2 0
1
2
3
4
5
6
7
8
9
10
11
12
fid = fopen('asciiData.txt','r');
i = 1;
while ~feof(fid)
name(i,:) = fscanf(fid,'%5c',1);
year(i) = fscanf(fid,'%d',1);
no1(i) = fscanf(fid,'%d',1);
no2(i) = fscanf(fid,'%d',1);
no3(i) = fscanf(fid,'%g',1);
no4(i) = fscanf(fid,'%g\n');
i=i+1;
end
fclose(fid);

txt 文件实用示例

例子 1

1
2
3
4
5
6
7
8
9
10
11
12
clear all
x=0:0.1:1.0;
k=1; mu=2;
Y=[x;mu*exp(k*x)];
fid=fopen('demo.txt','a+');
fprintf(fid,'\n');
fprintf(fid,'%36s \n','--- Function Data ---');
fprintf(fid,'\n');
fprintf(fid,'%5s %d %5s %d \n','k =',k,'mu =',mu);
fprintf(fid,'\n');
fprintf(fid,'%6.2f %12.8f\n',Y);
fclose(fid);

输出

demo.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

--- Function Data ---

k = 1 mu = 2

0.00 2.00000000
0.10 2.21034184
0.20 2.44280552
0.30 2.69971762
0.40 2.98364940
0.50 3.29744254
0.60 3.64423760
0.70 4.02750541
0.80 4.45108186
0.90 4.91920622
1.00 5.43656366

例子 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
clear all
k=2; mu=0.0001; h=0.1;
funstr='y=mu*sin(k*x)*exp(-x^2)';
Xv=0.1:h:1;

%% 文件预处理
fid=fopen('Result.txt','a+');
fprintf(fid,'\n');
fprintf(fid,'%54s \r\n','--- Numerical Results of Model Equation ---');
fprintf(fid,'\r\n');
fun=@(x) mu*sin(k*x)*exp(-x.^2);
fprintf(fid,'%42s \r\n',funstr);
fprintf(fid,'\r\n');
fprintf(fid,'%15s%d, %5s%f, %5s%f \r\n','k=',k,'mu=',mu,'h=',h);
fprintf(fid,'\r\n');
fprintf(fid,'%4c %18s %25s \r\n','X','dataY','dataZ');

%% 保存数据到文件
for N=1:length(Xv)
X=Xv(N);
dataY=fun(X);
dataZ=(fun(X)).^2;
% 保存每次循环得到的数据
fprintf(fid,'%6.2f %25.16d %25.16d \r\n',X,dataY,dataZ);
end
% 关闭文件
fclose(fid);

输出

Result.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
         --- Numerical Results of Model Equation ---  

y=mu*sin(k*x)*exp(-x^2)

k=2, mu=0.000100, h=0.100000

X dataY dataZ
0.10 1.9669253792470886e-05 3.8687954475263035e-10
0.20 3.7414903070235580e-05 1.3998749717551239e-09
0.30 5.1604436496440273e-05 2.6630178661151367e-09
0.40 6.1129053733710925e-05 3.7367612103789178e-09
0.50 6.5533826190025598e-05 4.2946823751044851e-09
0.60 6.5026160525221639e-05 4.2284015526518927e-09
0.70 6.0371251473283679e-05 3.6446880044504570e-09
0.80 5.2706758815719921e-05 2.7780024248584695e-09
0.90 4.3322397386826647e-05 1.8768301153421242e-09
1.00 3.3451182923926232e-05 1.1189816390099739e-09

参考资料