本节说明如何将磁盘上的文本或表格数据读入 MATLAB 工作区,以及在数字与字符串之间转换、用 save 与 load 保存和恢复变量。实验数据常存于 CSV 或空格分隔的文本文件中;使用导入函数可避免手工逐条输入。若文件含表头行,须在读取时指定跳过的行数,以便数值与列名分别存放。

本站 在线编译器不提供磁盘文件,下列读文件与 save / load 示例供对照查阅,请在本地 MATLAB 或 Octave 中指定工作目录后练习。数字与字符串互转可在在线环境中直接运行。

importdata

对空格、逗号分隔的文本,可首先尝试 importdata。文件只有数值时,返回值往往就是矩阵;带表头时则返回结构体,数值与列名分开放:

A = importdata('filename.txt')

部分用法如下:

A = importdata('data.txt', ' ');          % 指定列分隔符为空格
A = importdata('data.txt', ',', 1);       % 逗号分隔,跳过第 1 行表头
[data, delim, header] = importdata('f.txt') % 顺便拿到分隔符和表头行数

第二个参数是列分隔符,第三个参数是要跳过的表头行数。GNU Octave 中同类任务也常用 dlmread、csvread 或 load 读纯数值文件,函数名以当前环境的帮助为准。

带表头的文件

若 weeklydata.txt 第一行为列名、其后为数值,可通过第三个参数跳过表头:

A = importdata('weeklydata.txt', ' ', 1);
A.data          % 数值矩阵
A.colheaders    % 列名 cell 数组

此时结果结构体包含 A.data(数值部分)与 A.colheaders(列名字符串)两个字段。后续计算应对 A.data 进行,而不要把整个结构体交给 mean 等函数。MATLAB 中带列名的表也可用 readtable 读成 table,见表格;该类型在 Octave 中通常不可用。

数字与字符串互转

导入、导出及拼接文件名时,常需在数字与文本之间转换:

num2str(3.14)         % '3.14'
str2double('3.14')    % 3.14
str2num('1 2 3')      % [1 2 3]
int2str(42)           % '42'

str2double 针对单个数字字符串,失败时返回 NaN;str2num 可解析一段含空格的表达式,但也会执行其中的 MATLAB 代码,处理外部文件内容时更宜使用 str2double。函数说明见 num2str、str2double。

在循环中构造带序号的文件名示例:

for k = 1:3
    fname = ['data_', num2str(k), '.txt'];
    disp(fname)
end
data_1.txt
data_2.txt
data_3.txt

save 与 load

可将工作区变量写入 .mat 二进制文件,并在后续会话中加载,而不必每次从文本重新导入:

save mydata       % 保存所有变量到 mydata.mat
load mydata       % 重新加载
save results.mat x y   % 只保存 x 和 y

save 默认写入当前文件夹下的 .mat 文件;load 会把其中的变量按原名放回工作区,若工作区已有同名变量将被覆盖。只保存部分变量时可在文件名后列出变量名。纯文本的逐行读写见下一节。

本节说明了 importdata、带表头文件的读法、常用类型转换函数以及 save / load。下一节介绍低级文件读写:fopen、fprintf、fscanf、fgetl 与矩阵级导入导出。