本节说明如何将磁盘上的文本或表格数据读入 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)
enddata_1.txt
data_2.txt
data_3.txtsave 与 load
可将工作区变量写入 .mat 二进制文件,并在后续会话中加载,而不必每次从文本重新导入:
save mydata % 保存所有变量到 mydata.mat
load mydata % 重新加载save results.mat x y % 只保存 x 和 ysave 默认写入当前文件夹下的 .mat 文件;load 会把其中的变量按原名放回工作区,若工作区已有同名变量将被覆盖。只保存部分变量时可在文件名后列出变量名。纯文本的逐行读写见下一节。
本节说明了 importdata、带表头文件的读法、常用类型转换函数以及 save / load。下一节介绍低级文件读写:fopen、fprintf、fscanf、fgetl 与矩阵级导入导出。