当前位置:首页 >> 理学 >>

Matlab数据文件的读写


Matlab 数据文件的读写
在编写一个程序时,经常需要从外部读入数据,或者将程序 运行的结果保存为文件。MATLAB 使用多种格式打开和保存数 据。本章将要介绍 MATLAB 中文件的读写和数据的导入导出。

了解 MATLAB 的基本数据操作 掌握 MATLAB 中文本文件的读写方式 掌握 MATLAB 通过界面导入导出数据 了解 MATLAB 中的基本输入输出函数 13.1 数据基本操作 本节介绍基本的数据操作, 包括工作区的保存、导入和文件 打开。 13.1.1 文件的存储 MATLAB 支持工作区的保存。用户可以将工作区或工作区 中的变量以文件的形式保存,以备在需要时再次导入。 保存工作 区可以通过菜单进行,也可以通过命令窗口进行。 1. 保存整个工作区 选择 File 菜单中的 Save Workspace As…命令,或者单击工 作区浏览器工具栏中的 Save,可以将工作区中的变量保存为 MAT 文件。 2. 保存工作区中的变量 在工作区浏览器中,右击需要保存的变量名,选择 Save

As…,将该变量保存为 MAT 文件。 3. 利用 save 命令保存 该命令可以保存工作区,或工作区中任何指定文件。该命令 的调用格式如下: ● save:将工作区中的所有变量保存在当前工作区中的文件中, 文件名为 matlab.mat,MAT 文件可以通过 load 函数再次导入 工作区,MAT 函数可以被不同的机器导入,甚至可以通过其他 的程序调用。 ● save('filename'):将工作区中的所有变量保存为文件,文件名 由 filename 指定。如果 filename 中包含路径,则将文件保存在 相应目录下,否则默认路径为当前路径。 ● save('filename', 'var1', 'var2', ...): 保存指定的变量在 filename 指定的文件中。 ● save('filename', '-struct', 's'):保存结构体 s 中全部域作为单独 的变量。 ● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体 s 中的指 定变量。 ● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存 的变量需满足的条件。 ● save('..., 'format'),指定保存文件的格式,格式可以为 MAT 文件、ASCII 文件等。 13.1.2 数据导入

MATLAB 中导入数据通常由函数 load 实现, 该函数的用法 如下: ● load:如果 matlab.mat 文件存在,导入 matlab.mat 中的所有 变量,如果不存在,则返回 error。 ● load filename:将 filename 中的全部变量导入到工作区中。 ● load filename X Y Z ...:将 filename 中的变量 X、Y、Z 等导 入到工作区中,如果是 MAT 文件,在指定变量时可以使用通配 符“*”。 ● load filename -regexp expr1 expr2 ...:通过正则表达式指定需 要导入的变量。 ● load -ascii filename: 无论输入文件名是否包含有扩展名, 将其 以 ASCII 格式导入;如果指定的文件不是数字文本,则返回 error。 ● load -mat filename:无论输入文件名是否包含有扩展名,将其 以 mat 格式导入; 如果指定的文件不是 MAT 文件, 则返回 error。 例 13-1 将文件 matlab.map 中的变量导入到工作区中。 首先应用命令 whos –file 查看该文件中的内容: >> whos -file matlab.mat Name A I_q ans Size 2x3 415x552x3 1x3 Bytes Class 48 double array 687240 uint8 array 24 double array

num_of_cluster

1x1

8 double array

Grand total is 687250 elements using 687320 bytes 将该文件中的变量导入到工作区中: >> load matlab.mat 该命令执行后,可以在工作区浏览器中看见这些变量, 如图 13-1 所示。

图 13-1 导入变量后的工作区视图 接下来用户可以访问这些变量。 >> num_of_cluster num_of_cluster = 3 MATLAB 中,另一个导入数据的常用函数为 importdata, 该函数的用法如下: ● importdata('filename'), filename 中的数据导入到工作区中; 将 ● A = importdata('filename'),将 filename 中的数据导入到工作 区中,并保存为变量 A; ● importdata('filename','delimiter'),将 filename 中的数据导入 到工作区中,以 delimiter 指定的符号作为分隔符; 例 13-2 从文件中导入数据。 >> imported_data = importdata('matlab.mat') imported_data =

ans: [1.1813 1.0928 1.6534] A: [2x3 double] I_q: [415x552x3 uint8] num_of_cluster: 3 与 load 函数不同,importdata 将文件中的数据以结构体的 方式导入到工作区中。 13.1.3 文件的打开 MATLAB 中可以使用 open 命令打开各种格式的文件, MATLAB 自动根据文件的扩展名选择相应的编辑器。 需要注意的是 open('filename.mat')和 load('filename.mat')的 不同, 前者将 filename.mat 以结构体的方式打开在工作区中, 后 者将文件中的变量导入到工作区中,如果需要访问其中的内容, 需要以不同的格式进行。

例 13-3 open 与 load 的比较。 >> clear >> A = magic(3); >> B = rand(3); >> save Saving to: matlab.mat >> clear >> load('matlab.mat')

>> A A= 8 3 4 >> B B= 0.9501 0.2311 0.6068 >> clear >> open('matlab.mat') ans = A: [3x3 double] B: [3x3 double] >> struc1=ans; >> struc1.A ans = 8 3 4 1 5 9 6 7 2 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214 1 5 9 6 7 2

>> struc1.B

ans = 0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214

13.2 文本文件的读写 在上一节中介绍的函数和命令主要用于读写 mat 文件,而 在应用中,需要读写更多格式的文件,如文本文件、word 文件、 xml 文件、xls 文件、图像文件和音视频文件等。本节介绍文本 文件(txt)的读写。其他文件的读写,用户可以参考 MATLAB 帮 助文档。 MATLAB 中实现文本文件读写的函数如表 13-1 所示。 表 13-1 MATLAB 中文本文件读写函数 函 功 数 能

csvread 读入以逗号分隔的数据 csvwrite 将数据写入文件,数据间以逗号分隔 dlmread 将以 ASCII 码分隔的数值数据读入到矩阵中 dlmwrite 将矩阵数据写入到文件中,以 ASCII 分隔

textread 从文本文件中读入数据,将结果分别保存 textscan 从文本文件中读入数据,将结果保存为单元数组

下面详细介绍这些函数。 1. csvread、csvwrite csvread 函数的调用格式如下: ● M = csvread('filename'),将文件 filename 中的数据读入,并 且保存为 M,filename 中只能包含数字,并且数字之间以逗号 分隔。M 是一个数组,行数与 filename 的行数相同,列数为 filename 列的最大值,对于元素不足的行,以 0 补充。 ● M = csvread('filename', row, col),读取文件 filename 中的数 据,起始行为 row,起始列为 col,需要注意的是,此时的行列 从 0 开始。 ● M = csvread('filename', row, col, range), 读取文件 filename 中 的数据, 起始行为 row, 起始列为 col, 读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中 R1、C1 为读取 区域左上角的行和列,R2、C2 为读取区域右下角的行和列。 csvwrite 函数的调用格式如下: ● csvwrite('filename',M) , 将 数 组 M 中 的 数 据 保 存 为 文 件 filename,数据间以逗号分隔。

● csvwrite('filename',M,row,col),将数组 M 中的指定数据保存 在文件中,数据由参数 row 和 col 指定,保存 row 和 col 右下角 的数据。 ● csvwrite 写入数据时每一行以换行符结束。另外,该函数不返 回任何值。 这两个函数的应用见下面的例子。 例 13-4 函数 csvread 和 csvwrite 的应用。 本例首先将 MATLAB 的图标转化为灰度图, 将数据存储在 文本文件中,再将其部分读出,显示为图形。 编写 M 文件,命名为 immatlab.m,内容为: % the example of functions csvread and csvwrite I_MATLAB= imread('D:\matlab.bmp'); image I_MATLAB= rgb2gray(I_matlab); image to gray image figure,imshow(I_matlab,'InitialMagnification',100); show the image csvwrite('D:\matlab.txt',I_matlab); a text file sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data sub_MATLAB= uint8(sub_matlab); % convert the % write the data into % % convert the % read in the

data to uint8

figure,imshow(sub_matlab,'InitialMagnification',100); show the new image 在命令窗口中运行该脚本,输出图形如图 13-2 所示。

%

(a) 图 13-2 例 13-3 的运行结果

(b)

该例中涉及到了少量的图像处理内容,超出本书的范围,感 兴 趣 的 读 者 可 以 查 阅 MATLAB 帮 助 文 档 中 关 于 Image Processing Toolbox 的介绍。

2. dlmread、dlmwrite
dlmread 函数用于从文档中读入数据, 其功能强于 csvread。 dlmread 的调用格式如下: ● M = dlmread('filename') ● M = dlmread('filename', delimiter) ● M = dlmread('filename', delimiter, R, C) ● M = dlmread('filename', delimiter, range) 其中参数 delimiter 用于指定文件中的分隔符,其他参数的 意义与 csvread 函数中参数的意义相同, 这里不再赘述。 dlmread 函数与 csvread 函数的差别在于,dlmread 函数在读入数据时可 以指定分隔符,不指定时默认分隔符为逗号。

dlmwrite 函数用于向文档中写入数据, 其功能强于 csvwrite 函数。dlmwrite 函数的调用格式为: ● dlmwrite('filename', M),将矩阵 M 的数据写入文件 filename 中,以逗号分隔。 ● dlmwrite('filename', M, 'D'),将矩阵 M 的数据写入文件 filename 中,采用指定的分隔符分隔数据,如果需要 tab 键,可 以用“\t”指定。 ● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。 ● dlmwrite('filename', M, attribute1, value1, attribute2,

value2, ...),指定任意数目的参数,可以指定的参数见下表。 ● dlmwrite('filename', M, '-append'),如果 filename 指定的文件 存在,在文件后面写入数据,不指定时则覆盖原文件。 ● dlmwrite('filename', M, '-append', attribute-value list), 叙写文 件,并指定参数。 ● dlmwrite 函数的可用参数如表 13-2 所示。 表 13-2 dlmwrite 函数的可用参数 参 数 名 功 能

delimiter 用于指定分隔符 newline 用于指定换行符,可以选择“pc”或者“unix”

roffset 行偏差,指定文件第一行的位置,roffset 的基数为 0 coffset 列偏差,指定文件第一列的位置,coffset 的基数为 0 precision 指定精确度,可以指定精确维数,或者采用 c 语言的格式,如 “%10.5f”

3. textread,textscan 当文件的格式已知时,可以利用 textread 函数和 textscan 函数读入。这里只介绍这两个函数应用的实例。 例 13-5 通过%读入文件,按照原有格式读取。 文件的内容为: Sally Level1 12.34 45 Yes

在命令窗口中输入: >> [names, types, x, y, answer] =

textread('D:\mat.txt','%s %s %f %d %s', 1) 得到结果为: names = 'Sally' types = 'Level1'

x= 12.3400 y= 45 answer = 'Yes'

例 13-6 函数 csvread 和 csvwrite 的应用 Sally Level1 12.34 45 1.23e10 inf NaN Yes Joe Level2 23.54 60 9e19 -inf 0.001 No Bill Level3 34.90 12 2e5 10 100 No >> fid = fopen('D:\mat.txt'); >> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s'); >> fclose(fid); 13.3 低级文件 I/O 本节介绍一些基本的文件操作,这些操作如表 13-3 所示。 表 13-3 MATLAB 的基本文件操作 函 功 数 能 fclose 关闭打开的文件

feof 判断是否为文件结尾 ferror 文件输入输出中的错误查找 fgetl 读入一行,忽略换行符 fgets 读入一行,直到换行符 fopen 打开文件,或者获取打开文件的信息 fprintf 格式化输入数据到文件 fread 从文件中读取二进制数据 frewind 将文件的位置指针移至文件开头位置 fscanf 格式化读入 fseek 设置文件位置指针 ftell 文件位置指针

fwrite 向文件中写入数据

下面重点介绍函数 fprintf。该函数的调用格式如下: count = fprintf(fid, format, A, ...),该语句将矩阵 A 及后面 其他参数中数字的实部以 format 指定的格式写入到 fid 指定的 文件中,返回写入数据的字节数。 上面语句中,参数 format 由%开头,共可由 4 个部分组成, 分别如下: ● 标记(flag),为可选部分。 ● 宽度和精度指示,为可选部分。 ● 类型标志符,为可选部分。 ● 转换字符,为必需部分。 1. 标记 标记用于控制输出的对齐方式,可以选择的内容如表 13-4 所示。 表 13-4 标记的可选内容 函 功 示 数 能 例 负号(-) 在参数左侧进行判别

%-5.2d 加号(+) 在数字前添加符号 %+5.2d 空格 在数字前插入空格 % 5.2d 0 在数字前插入 0 %05.2d 2. 宽度和精度指示 用户可以通过数字指定输出数字的宽度及精度,格式如下: ● %6f,指定数字的宽度; ● %6.2f,指定数字的宽度及精度; ● %.2f,指定数字的精度。 例 13-6 fprintf 函数宽度和精度指示符示例。 在命令窗口中输入如下命令: >> file_type = fopen('D:\type.txt','w'); >> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3); >> fprintf(file_h, '%6f %12f\n', 1.2, -43.3); >> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3); >> fclose(file_h)

ans = 0 打开该文件,其内容为: 1.20 -43.30000000 1.200000 -43.300000

1.20 -43.30000000 从上述结果可以看出宽度和精度控制的效果。 3. 转换字符 转换字符用于指定输出的符号,可以选择的内容如表 13-5 所示。 表 13-5 格式化输出的标志符及意义 标 志 符 意 义 %c 输出单个字符 %d 输出有符号十进制数 %e 采用指数格式输出,采用小写字母 e,如:3.1415e+00 (续表) 标 志 符 意 义

%E 采用指数格式输出,采用大写字母 E,如:3.1415E+00 %f 以定点数的格式输出 %g %e 及%f 的更紧凑的格式,不显示数字中无效的 0 %G 与%g 相同,但是使用大写字母 E %i 有符号十进制数 %o 无符号八进制数 %s 输出字符串 %u 无符号十进制数 %x 十六进制数(使用小写字母 a-f) %X 十六进制数(使用大写字母 A-F)

其中 %o、%u、%x、%X 支持使用子类型,具体情况这里

不再赘述。格式化输出标志符的效果见下面的例子。 例 13-7 fprintf 格式化输出示例。 >> x = 0:.1:1; >> y = [x; exp(x)]; >> fid = fopen('exp.txt', 'wt'); >> fprintf(fid, '%6.2f %12.8f\n', y); >> fclose(fid) ans = 0 显示该文件: >> type exp.txt 0.00 0.10 … 0.90 1.00 2.45960311 2.71828183 1.00000000 1.10517092

例 13-9 利用 fprintf 函数在显示器上输出字符串 >> fprintf(1,'It''s Friday.\n') It's Friday. 在该例中,利用 1 表示显示器, 并且用两个单引号显示单引 号,使用\n 进行换行。在格式化输出中,这类符号称为转义符。 MATLAB 中的常用转义符如表 13-6 所示。

表 13-6 MATLAB 中的常用转义符 转 义 符 功 \b 退格 \f 表格填充 \n 换行符 \r 回车 \t tab \\ \,反斜线 \'' 或 '' ',单引号 %% %,百分号 能

三. 具体例子分析:
Matlab 网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据, 如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了:

1. 纯数据(列数相同): 源文件:

CODE: 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186

解答:对于这个 txt 文件,由于各行列数相同,故简单地使用 load,importdata 均可。

2.字段名(中、英文字段均可)+数据: 源文件:

CODE: CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698

解答:由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。

3.注释(含有独立的数字串)+数据(列数相同): 问题:这个文件有 4 列,但前 6 行是文字说明,4 列数字是从第 8 行开始的.现在我想把这个文件 的前 2 列和文字说明提出来组成一个新的 dat 文件 源文件:

CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 CH2 CH3 0.000378 0.000245 0.000598 0.000698

0.000123 0.000986

0.000325 0.000256

目标文件:

CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256

解答:由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用 importdata, load 等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用 低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即:[a b c d] = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的 读取方法如下: -------------------------------------转 -------------------------------------------------------------------------------------CODE: clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline)

if double(tline(1))>=48 && double(tline(1))<=57 a=strread(tline); a(3:4)=[]; fprintf(fid_n,'%f %f\n',a); clear a; elseif double(tline(1))==67 b=[b1{1},' ',b2{1}]; %字母 C 开始 [b1,b2,b3,b4]=strread(tline,'%s %s %s %s'); fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n);

%数值开始

---------------------------------------------------------------------------------

4. 注释(不含独立的数字串)+数据(列数相同):
源文件: CODE: 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555

解答:直接用 importdata 便可 注:有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确, 建议这时候使用第 3 种情形的读取方式。

5. 注释与数据混排:

对此当然只能自己编程,举例: 源文件: CODE: 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555

解答: --------------------------------------------转 --------------------------------------

CODE: function [data]=distilldata(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个 data 变量中 %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 [m,n]=size(tline); flag=1; for i=1:n %判断一行中有没有字符(+-.Ee 和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'...

|(double(tline(i))>=48&&double(tline(i))<=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile);

-------------------------------------------------------------------------------------------------------另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先 知道文件内容的结构(即哪行是数据、哪行是注释)

6.各列数据的分离:
源文件:

CODE: 0 + 2 + 4 + 6 + 8 + 10 + 12 + 14 + 16 + 18 + 20 + 22 + 24 + 47038.7 46477.7 44865.7 41786.4 39896.0 37518.4 35858.5 46105.0 46168.6 48672.3 49565.7 49580.7 49602.3 1.05 1.03 1.04 1.03 0.97 0.93 0.92 1.03 6.89 4.33 0.49 0.53 0.84 09:26:07 09:28:38 09:28:48 09:28:56 09:29:03 09:29:15 09:29:30 09:30:21 09:30:30 09:30:40 09:30:48 09:30:55 09:31:03 C C C C C C C C C C C C C

26 + 28 + 30 + 32 + 34 +

49582.5 49577.0 49589.3 49578.3 49512.5

1.51 1.39 0.61 1.06 1.77

09:31:11 09:31:19 09:31:27 09:31:29 09:31:38

C C C C C

解答:直接用 [a,b,c,d,e,f]=textread(yourfilename,'%d %c %f %f %s %c'); 便可

四. 注意事项:
1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该 数据文件的具体路径。

2. 存取时,请给出该数据文件的全称(包括后缀名,读取 mat 文件时可省略)

3. load data.txt 和 A=load(‘data.txt’)的区别请参阅精华贴:[原创]写给学习 matlab 的 新手们

4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。 如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取, 或者直接用 a+ 进行同时读写操作。 否则, 会产生莫名其妙的问题! 以下代码是一个错误的例子:

CODE: filename='e.dat'; fid=fopen(filename,'a'); if fid<0 error('fopen error'); end s=[1 2 3 4;5 6 7 8]; fwrite(fid,s,'float32') [dd ll]=fread(fid,inf,'float32');%把 t 中的数据全部读出,即 s 矩阵。

fclose(fid);

此时得到的 dd, ll 是错误且无意义的!

五. 其他相关问题:
1. 连续读取多个文件的数据,并存放在一个矩阵中:
(1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第 i 个文件的文件名就可以表示为 filename(i).name 文件数量为:length(filename) 方法二: 先在 Windows 的 MSDOS(命令行)中使用以下命令生成一个 list.txt 文件: dir path\folder /on /b /s > path\list.txt

举例:dir d:\test /on /b /s > d:\list.txt

然后在 matlab 中使用:

filename = textread(sFileFullName,'%s');

把所有文件名读取到 list 细胞矩阵中,最后对 filename{i}便可得到各文件名。

(2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是 m*n 的,则: CODE: k = length(filename);

Data = zeros(m,n,k); for ii = 1:k Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle 是对应的文件读取方式的 函数 end

2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中:
假设每个文件对应的数据是 m*n 的,则以上述第二种文件名读取方法为例: CODE: k = length(filename); for ii = 1:k D = yourreadstyle(filename{ii}); eval([‘Data_’, num2str(ii), ‘ = D;’]); end

3. 文件名命名问题:
文 件 名 为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879. 解答: CODE: a=cell(879,1); for k=1:879 a{k} = sprintf('%.5d',k); end 准备把这些文件名给放到一个数组里面去。

4. 上述各种文件格式、类型自动识别问题:可以利用正则表达式来处理,使之通用性
较强。 例如使用以下代码可以自动处理上面提到了例 1 到例 5 各种情形, 不过由于存在自动判断, 对某些例子(如例 1)效率自然要低一点,而对于另外的例子(如例 3、例 5)效率估计要高一 点(少用了一个循环)。

CODE:

function [data]=distilldata_eight(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个 data 变量中(自动判断数据行) %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = '[^0-9 | \. | \- | \s | e | E]'; %正则表达式为:该行中是否包含除 - . E e 数 字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile)

5. 大量数据的读取问题:
可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此 可以参阅本版精华贴: [原创]提高 matlab 运行速度和节省空间的一点心得(之三))。另外, 也可参考《深入浅出 MATLAB 7_X 混合编程》一书第一章

6. 读取整个 txt 文件的内容(获得文件中的所有字符):
CODE:

f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f);

7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = [1 2 3;4 5 6] ,希望得到的 txt 文件如下:

QUOTE: a1: 123 a2: 1 2 3 4 5 6

如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: CODE: a1=123; a2=[1 2 3;4 5 6]; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: mat2str(eval(['a',int2str(i)]))); end fclose(fid);

\n

%s\n',

['a',int2str(i)],

相反,如果写入的时候复杂一点,则读取的时候会简单一点: CODE: a1=123; a2=[1 2 3;4 5 6]; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n', ['a',int2str(i)]);

b = eval(['a',int2str(i)]); fprintf(fid, [repmat('%d ', 1, size(b,2)), '\n'], b'); end fclose(fid);


赞助商链接
相关文章:
Matlab中txt文件的读写操作命令及操作
Matlab 中 txt 文件的读写操作命令整理 将 txt 文件中的数据按行显示输出内容:从一个列向量文件中按要求读取指定部分数据后存储成另一个文件。 clear; clc; ...
Matlab学习系列-011. 数据的读写、导入及导出
暂无评价|0人阅读|0次下载|举报文档 Matlab学习系列-011. 数据的读写、导入及导出_计算机软件及应用_IT/计算机_专业资料。Matlab数据读写、导入及导出,代码实例...
matlab中如何读取TXT数据文件
今天需要做个 matlab 读取 txt 文件,在网上收集了下,查到了几篇不错的,总 结一下,方便大家(包括 me)使用: 下面这个函数是取 filein 中的第 line 行写入 ...
matlab对文件目录操作及读写文件
matlab文件目录操作及读写文件_IT/计算机_专业资料。Matlab 对路径的操作及读...(fid) 8、 fwrite 、 用于将二进制数据写入文件中,需要和 fopen,fclose 配合...
Matlab 的数据文件读取
Matlab数据文件读取_IT/计算机_专业资料。Matlab数据文件I/ O 的实现方法 0 引言 Matlab 是一个功能强大的计算机辅助设计软件,被称为“草稿纸式的科学计算...
matlab文件数据读写
matlab文件数据读写_计算机软件及应用_IT/计算机_专业资料。matlab 数据读写 文件MATLAB文件输入及输出指令一、基本文件输入输出 File import/export functions. dl...
matlab中的数据导入和导出
MATLAB 使用多种格式打开和保存数据。本章将要介绍 MATLAB文件的 读写数据的导入导出。 13.1 数据基本操作 本节介绍基本的数据操作,包括工作区的保存、导入...
Matlab文件操作及读txt文件(fopen,fseek,fread,fclose)
Matlab 文件操作及读 txt 文件(fopen,fseek,fread,fclose) matlab 文件操作 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将 结果写入数据文件MATLAB...
matlab 读写excel操作
matlab 读写excel操作_计算机软件及应用_IT/计算机_专业资料。matlab 读写 excel...中的位置一致。 如果 Sheet 内都是数据,可直接使用 data = xlsread(文件名)...
matlab读取文件
matlab读取文件_电脑基础知识_IT/计算机_专业资料。matlab读取文件 ...在该数据文件对应的目录下进行存取, 否则, 存取时请给出 该数据文件的具体路径...
更多相关标签: