Matlab的I/O文件操作使用技巧和总结:


 

1. Matlab 支持的I/O文件(对应“取/存”操作)类型:(所有文件I/O程序不需要特殊的工具箱)

http://www.mathworks.com/support/tech-notes/1100/1102.html

 

(注:从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式)

 

2. Matlab I/O文件指南:

http://www.mathworks.com/support/tech-notes/1600/1602.html

 

 

以下是部分对应的中文译文:

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

本技术支持指南主要处理:ASCII, binary, and MAT files.

要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令:

help iofun

 

MATLAB中有两种文件I/O程序:high level and low level.

High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。

Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。

 

 

 

High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。

举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以调用一些low level routines自己写一个函数,或者是简单的用TEXTREAD函数。

使用high level routines的关键是:文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。

LOAD/SAVE

 

主要的high level file I/O routines LOAD  SAVE函数。LOAD

可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt :

1 5 4 16 8

5 43 2 6 8

6 8 4 32 1

90 7 8 7 6

5 9 81 2 3

Example:

 LOAD and SAVE 读写数据

 

 

 

CODE:

 

% Load the file to the matrix, M :

M = load('sample_file.txt')

 

% Add 5 to M :

M = M +5

 

% Save M to a .mat file called 'sample_file_plus5.mat':

save sample_file_plus5 M

 

% Save M to an ASCII .txt file called 'sample_file_plus5.txt' :

save sample_file_plus5.txt M -ascii

 

 

 

 

 

UIGETFILE/UIPUTFILE

 

UIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。UIGETFILE让你选择一个文件来写(类似Windows ‘另存为’选项?)。用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。

Example:

 UIGETFILE 从当前目录选择一个 M-file

 

 

 

CODE:

 

% This command lists all the M-files in the current directory and

% returns the name and path of the selected file

 

 

[fname,pname] = uigetfile('*.m','Sample Dialog Box')

 

 

 

 

 

注意: UIGETFILE 一次只能选择一个文件。

UIIMPORT/IMPORTDATA

 

UIIMPORT是一个功能强大,易于使用的基于GUIhigh level routine,用于读complex data files。文件也必须是homogeneous

IMPORTDATA形成UIIMPORT的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件'sample_file2.txt' 

This is a file header.

This is file is an example.

col1 col2 col3 col4

   1      612.000

   1      613.000

   1      614.000

   1      615.000

Example: Using IMPORTDATA to read in a file with headers, text, and numeric data

 

 

 

CODE:

 

% This reads in the file 'sample_file2.txt' and creates a

% structure D that contains both data and text data.

% Note the IMPORTDATA command specifies a white space

% as the delimiter of the file, but IMPORTDATA can usually

% detect this on its own

 

D = importdata('sample_file2.txt','')  % 原文有误?

 

D = importdata('sample_file2.txt')

 

 

 

 

 

可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:

data = D.data

text = D.textdata

可以用UIIMPORT读同一个文件并得到同样的结构.

注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。

TEXTREAD/STRREAD

 

TEXTREAD 是一个强大的动态high level routine,设计用来读ASCII格式的文本和/或数值数据文件。STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD

两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个

“两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的应用(如同low level routines做到的)。例子:

 

 

 

CODE:

 

Example 1: Using TEXTREAD to read in an entire file into a cell array

 

% This command reads in the file fft.m into the cell array, file

 

file = textread('fft.m','%s','delimiter','\n','whitespace','');

 

 

 

 

CODE:

 

Example 2: Using STRREAD to read the words in a line

 

% This command uses the cell array created in Example 1 to

% read in each word of line 28 in 'file' to a cell array, words

 

words = strread(file{28},'%s','delimiter','')

 

 

 

 

CODE:

 

Example 3: Using TEXTREAD to read in text and numeric data from a file with headers

 

% This command skips the 2 header lines at the top of the file

% and reads in each column to the 4 specified outputs

 

[c1 c2 c3 c4] = textread('sample_file2.txt','%s %s %s %s','headerlines',2)

 

 

 

 

 

CODE:

 

Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file

 

% This command reads in rows B and C of the file. The 'headerlines'

% property is used to move down to the desired starting row and the

% read operation is performed 2 times

 

[c1 c2 c3 c4] = textread('sample_file2.txt',...

'%s %s %s %s',2,'headerlines',4)

 

 

 

CODE:

 

Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers

 

% This command reads in only the numeric data in the file. The

% 'headerlines' property is used to move down to the first row

% of interest and the first column of text is ignored with the

% '*'  operator

 

[c2 c3 c4] = textread('sample_file2.txt','%*s %d %d %f','headerlines',3)

 

 

 

 

 

DLMREAD/DLMWRITE/CSVREAD

 

DLMREAD  DLMWRITE函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。

CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。以'sample_file.txt'为例:

 

 

 

CODE:

 

Example 1: Using DLMREAD to read in a file with headers, text, and numeric data

 

% This reads in the file 'sample_file2.txt' and creates a matrix, D,

% with the numeric data this command specifies a white space as the

% delimiter of the file

 

D = dlmread('sample_file.txt','')

 

 

 

 

 

 

CODE:

 

Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows

 

% This reads in the first 3 columns of the last 3 rows of

% the data file 'sample_file.txt'into the matrix, D_partial.

% 读文件 'sample_file.txt' 3列后3行,到矩阵D_partial.

 

D_partial = dlmread('sample_file.txt','',[2 0 4 2])

 

 

 

 

 

 

CODE:

 

Example 3: Using DLMWRITE to write a comma delimited file

 

% This creates a file called 'partialD.txt' that consists of

% the first 3 columns of the last 3 rows of data where each

% element is separated by a comma

 

dlmwrite('partialD.txt',D_partial,',')

 

 

 

 

 

注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。

WK1READ/WK1WRITE

 

WK1READ 用来读Lotus123 电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123 电子数据表文件。

XLSREAD

 

XLSREAD用来读Excel的数值和文本数据。

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

 

. 具体例子分析:

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.000123  0.000325   0.000378   0.000598

0.000986  0.000256   0.000245   0.000698

 

 

目标文件:

 

 

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   %字母C开始

           [b1,b2,b3,b4]=strread(tline,'%s %s %s %s');

           b=[b1{1},'  ',b2{1}];

            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 +  47038.7   1.05  09:26:07  C

           2 +  46477.7   1.03  09:28:38   

           4 +  44865.7   1.04  09:28:48   

           6 +  41786.4   1.03  09:28:56   

           8 +  39896.0   0.97  09:29:03   

          10 +  37518.4   0.93  09:29:15   

          12 +  35858.5   0.92  09:29:30   

          14 +  46105.0   1.03  09:30:21   

          16 +  46168.6   6.89  09:30:30   

          18 +  48672.3   4.33  09:30:40   

          20 +  49565.7   0.49  09:30:48   

          22 +  49580.7   0.53  09:30:55   

          24 +  49602.3   0.84  09:31:03   

          26 +  49582.5   1.51  09:31:11   

          28 +  49577.0   1.39  09:31:19   

          30 +  49589.3   0.61  09:31:27   

          32 +  49578.3   1.06  09:31:29   

          34 +  49512.5   1.77  09:31:38  C

 

 

 

 

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

 

 

. 注意事项:

 

 

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

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

3. load data.txtA=load(data.txt)的区别请参阅精华贴:

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_r([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 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: \n %s\n', ['a',int2str(i)], mat2str(eval_r(['a',int2str(i)])));

end

fclose(fid);

 

 

相反,如果写入的时候复杂一点,则读取的时候会简单一点:

 

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_r(['a',int2str(i)]);

    fprintf(fid, [repmat('%d ', 1, size(b,2)), '\n'], b');

end

fclose(fid);

 

 

 

根据txt文档不同种类介绍不同的读取数据方法

一、纯数据文件(没有字母和中文,纯数字)

对于这种txt文档,从matalb中读取就简单多了

例如test.txt文件,内容为

17.901 -1.1111 33.045
17.891 -1.1286 33.045
17.884 -1.1345 33.045

可以在command window中输入load test.txt ,然后就会产生一个test的数据文件,内容跟test.txt中的数据一样;另一种方法是在file/import data....../next/finish 也可产生一个叫test的数据文件。

二、中英文和数据如test1.txt

你好
欢迎来到
论坛
edu.cn
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555


这样的文件怎么读入数据呢?
方法有多种,现举两个比较简单实用的。

方法一:
file/import data....../next/finish
>> whos
Name           Size                   Bytes Class

data           5x4                      160 double array
textdata       4x1                      300 cell array

Grand total is 54 elements using 460 bytes

>> data

data =

           1          11         111        1111
           2          22         222        2222
           3          33         333        3333
           4          44         444        4444
           5          55         555        5555

>> textdata

textdata =

    '你好'
    '欢迎来到'
    '论坛'
    'edu.cn'

方法二:
[a1,a2,a3,a4]=textread('test1.txt','%s%s%s%s','headerlines',4)
说明:%s可以是其他形式,跟读入的数据类型有关,比如这里也可以用%n,%f等。
这里%s的个数和[a1,a2,a3,a4]对应。
>> [a1,a2,a3,a4]=textread('test1.txt','%s%s%s%s','headerlines',4)

a1 =

    '1'
    '2'
    '3'
    '4'
    '5'

a2 =

    '11'
    '22'
    '33'
    '44'
    '55'

a3 =

    '111'
    '222'
    '333'
    '444'
    '555'

a4 =

    '1111'
    '2222'
    '3333'
    '4444'
    '5555'
因以字符串的形式读入,所以有''。
————————————————————————————————

三、中文 数据 英文 混乱如test.txt

你好
1 11 111 1111
欢迎来到
2 22 222 2222
论坛
3 33 333 3333
edu.cn
4 44 444 4444
5 55 555 5555

说明:这种内容格式的文件用上面的方法是不行的。

以下是由chinamaker编写的一种方法:

fidin=fopen('test.txt');                               % 打开test2.txt文件            
fidout=fopen('mkmatlab.txt','w');                       % 创建MKMATLAB.txt文件
while ~feof(fidin)                                      % 判断是否为文件末尾              
    tline=fgetl(fidin);                                 % 从文件读行  
    if double(tline(1))>=48&&double(tline(1))<=57       % 判断首字符是否是数值
       fprintf(fidout,'%s\n\n',tline);                  % 如果是数字行,把此行数据写入文件MKMATLAB.txt
       continue                                         % 如果是非数字继续下一次循环
    end
end
fclose(fidout);
MK=importdata('MKMATLAB.txt');      % 将生成的MKMATLAB.txt文件导入工作空间,变量名为MK,实际上它不显示出来
>> MK

MK =

           1          11         111        1111
           2          22         222        2222
           3          33         333        3333
           4          44         444        4444
           5          55         555        5555

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

我的txt数据里既有数字又有字符串,形式为: 0.129515 DDAA 01 2.24609 94.50000 98 0.130434 DDAA 01 2.24609 96.30000 9A 0.131441 DDAA 01 2.24609 97.20000 9B 0.132448 DDAA 01 2.24609 99.00000 9D 0.133507 DDAA 01 2.24609 100.80000 9F 0.134515 DDAA 01 2.24609 101.70000 A0 ............ 我只想要第一列,第四列,第五列。 也就是0.129515 2.24609 94.50000 这3列数, 怎样导入matlab啊?

 

假设数据在data.txt里,且位于当面matlab路径里,用下面这句就可以了 [col1,col2,col3]=textread('data.txt','%f %*s %*d %f %f %*s',-1);

在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。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                  Size              Bytes Class
   A                    2x3              48 double array
   I_q                 415x552x3            687240 uint8 array
   ans                1x3               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     1     6
       3     5     7
       4     9     2
  >> B
  B =
      0.9501    0.4860    0.4565
      0.2311    0.8913    0.0185
      0.6068    0.7621    0.8214
  >> clear
  >> open('matlab.mat')
  ans =
      A: [3x3 double]
      B: [3x3 double]
  >> struc1=ans;
  >> struc1.A
  ans =
       8     1     6
       3     5     7
       4     9     2
  >> struc1.B
  ans =
      0.9501    0.4860    0.4565
      0.2311    0.8913    0.0185
      0.6068    0.7621    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');     % read in the image
  I_MATLAB= rgb2gray(I_matlab);          % convert the image to gray image
  figure,imshow(I_matlab,'InitialMagnification',100); % show the image
  csvwrite('D:\matlab.txt',I_matlab);     % write the data into a text file
  sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
  sub_MATLAB= uint8(sub_matlab);         % convert the data to uint8
  figure,imshow(sub_matlab,'InitialMagnification',100);      % show the new image
  在命令窗口中运行该脚本,输出图形如图13-2所示。

(a)                                            (b)
图13-2 例13-3 的运行结果
  该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 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 语言的格式,如“.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 ?2 ? %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                .2d

2. 宽度和精度指示
  用户可以通过数字指定输出数字的宽度及精度,格式如下:
● o,指定数字的宽度;
● %6.2f,指定数字的宽度及精度;
● %.2f,指定数字的精度。
例13-6 fprintf函数宽度和精度指示符示例。
  在命令窗口中输入如下命令:
  >> file_type = fopen('D:\type.txt','w');
  >> fprintf(file_h, '%6.2f .8f\n', 1.2, -43.3);
  >> fprintf(file_h, 'o f\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 .8f\n', y);
  >> fclose(fid)
  ans =
       0
  显示该文件:
  >> type exp.txt
   0.00   1.00000000
   0.10   1.10517092
  …
   0.90   2.45960311
   1.00   2.71828183
  例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
   \\              反斜线
   \'' 或 ''                                 单引号
   %%              百分号
13.4 利用界面工具导入数据
  除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。
  选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。

 

想用matlab读取txt文件,怎么实现

http://zhidao.baidu.com/question/249849169.html?an=0&si=1

输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。
1、文件的打开与关闭
1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。
fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’)
说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:
‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。
‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。
‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。
‘a’:在打开的文件末端添加数据。文件不存在则创建。
‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。
另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。
2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。
关闭文件用fclose函数,调用格式为: sta=fclose(fid)
说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。
  2、二进制文件的读写操作
1)写二进制文件
fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。
其调用格式为: COUNT=fwrite(fid,A,precision)
说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。
例6.8 将一个二进制矩阵存入磁盘文件中。
>> a=[1 2 3 4 5 6 7 8 9];
>> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件 fid = 3 %其值大于0,表示打开成功
>> fwrite(fid,a,'double') ans =9 %表示写入了9个数据
>> fclose(fid) ans =0 %表示关闭成功
2)读二进制文件
fread函数可以读取二进制文件的数据,并将数据存入矩阵。
其调用格式为: [A,COUNT]=fread(fid,size,precision)
说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;
若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。
3、文本文件的读写操作
1)读文本文件
fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。
其调用格式为: [A,COUNT]=fscanf(fid,format,size)
说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。
2)写文本文件
fprintf函数可以将数据按指定格式写入到文本文件中。
其调用格式为: fprintf(fid,format,A)
说明:fid为文件句柄,指定要写入数据的文件,format是用来控制所写数据格式的格式符,与fscanf函数相同,A是用来存放数据的矩阵。
例6.9 创建一个字符矩阵并存入磁盘,再读出赋值给另一个矩阵。
>> a='string';
>> fid=fopen('d:\char1.txt','w');
>> fprintf(fid,'%s',a);
>> fclose(fid);
>> fid1=fopen('d:\char1.txt','rt');
>> fid1=fopen('d:\char1.txt','rt');
>> b=fscanf(fid1,'%s') b = string
matlab读txt文件
fid=fopen('fx.txt','r'); %得到文件号
[f,count]=fscanf(fid,'%f %f',[12,90]); %把文件号1的数据读到f中。其中f是[12 90]的矩阵 %这里'%f %f'表示读取数据的形势,他是按原始数据型读出
fclose(fid); %关闭文件
另外有的txt文件还可以用load来打开 其语句为 f=load('fx.txt) 我个人觉得用第一种方式较好。因为有些时候,特别是fx.txt 的一行种有多个数据时用load 就比较麻烦了。
 
matlab如何读取含有文本的TXT数据文件并存入数组??
http://zhidao.baidu.com/question/139154026.html?fr=qrl&cid=93&index=4
有如下格式的数据文件:
5 jhg jy jyg jh kjh jh kjh
yuyu yu yt uyt uyt uyt uyt uyt
fh jhg jy jyg jh kjh jh kjh
kjh kjh 56 56 21 654 54 354
jh jh 54 6456 654 46 5 21
kjh kjh 12 56 54 -562 21 21
kjh kjh 321 412 654 54 4 23
kjh kjh 646 545 1254 54 21 1
kjh kjh 4 545 632 1 38 32
kjh kjh 21 3 -15 6554 55 63
kjh kjh 21 21 1 13107 3 94
kjh kjh 5 21 2 19660 45 125
kjh kjh 1 3 3 26213 52423 156
kjh kjh -639 -15 4 2 0 187
kjh kjh -319 2 21 21 21 218
kjh kjh 1 2 21 23 25 249
kjh kjh 321 321 21 23 25 280
如何才能读取该文件4到17行,3到8列的数据,并存入一个数组A中,我的数据文件为TXT文档:
clc;clear;close all;
hang=[4 17];%4行到17行。这样你也可以变化
lie=[3 8];%3到8列。这样你也可以变化
[FileName,PathName] = uigetfile('*.txt','Select the Txt files');%弹出对话框,然后选择你要处理的文件
fid=fopen([PathName FileName]);
temp=textscan(fid,'%s %s %s %s %s %s %s %s');
fclose(fid);
for i=1:(hang(2)-hang(1)+1)
for j=1:(lie(2)-lie(1)+1)
b=temp{j+lie(1)-1}{i+hang(1)-1};
A(i,j)=str2num(b);
end
end
 

三维矩阵存入txt文档

我已得到matlab结果为多个三维数组(224*196*224),但是由于内存限制,故需将这些矩阵保存txt 文件中,当需要时再从txt文件中读取,如何将多个三维矩阵依次存入txt文件中,并读取呢。

[rows,cols,thirds]=size(A);
dlmwrite( 'd:\1.txt', A, 'delimiter', '\t','precision', 16);
eo= dlmread('d:\1.txt');
EO=reshape(eo,rows,cols,thirds);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值