14.1.3 简单文件 I/O

saveload 命令允许以各种格式向磁盘文件写入数据以及从磁盘文件读取数据。save 命令写入文件的默认格式可以通过 save_default_optionssave_precision 函数进行控制。

例如,以下代码创建了一个 3×3 矩阵并将其保存到文件 ‘myfile.mat’ 中。

A = [ 1:3; 4:6; 7:9 ];
save myfile.mat A

一个或多个变量被保存到文件后,可以使用 load 命令将它们读入内存。

load myfile.mat
A
     -| A =
     -|
     -|    1   2   3
     -|    4   5   6
     -|    7   8   9
 
save file
save options file
save options file v1 v2
save options file -struct STRUCT
save options file -struct STRUCT f1 f2
save - v1 v2
str = save ("-", "v1", "v2", …)

将指定的变量 v1, v2, … 保存到文件 file 中。

如果未列出变量名,则 Octave 保存当前作用域中的所有变量。 否则,可以使用完整的变量名或通配符语法来指定要保存的变量。 如果使用了 -struct 修饰符,则标量结构体的字段将被保存,如同它们是以相应字段名为名的变量一样。 -struct 选项可以与特定的字段名 f1, f2, … 组合使用,以仅将特定的字段写入文件。

save 命令也可以使用函数形式调用:

save ("-option1", ..., "file", "v1", ...)

此时,optionsfile 和变量名参数(v1, …)必须指定为字符串。

save 命令的有效选项如下表所示。 修改输出格式的选项会覆盖 save_default_options 所指定的格式。

-append

追加到文件末尾,而不是覆盖原有内容。

-ascii

将矩阵保存为文本文件,不含头部信息或其他任何附加信息。矩阵必须是二维的,且只有复数值的实部会被写入文件。数字以单精度格式存储,并用空格分隔。-ascii 格式的附加选项如下:

-double

以双精度格式存储数字。

-tabs

用制表符分隔数字。

-binary

以 Octave 的二进制数据格式保存数据。

-float-binary

以 Octave 的二进制数据格式保存数据,仅使用单精度。请仅当您知道所有要保存的值都能用单精度表示时才使用此格式。

-hdf5

HDF5 格式保存数据。(HDF5 是一种由伊利诺伊大学国家超级计算应用中心开发的免费、可移植的二进制格式。)此格式仅在 Octave 编译时链接了 HDF5 库的情况下可用。

-float-hdf5

HDF5 格式保存数据,仅使用单精度。请仅当您知道所有要保存的值都能用单精度表示时才使用此格式。

-text (默认)

以 Octave 的文本数据格式保存数据。 save_precision 函数指定 保存数据时使用的有效数字位数(默认值:17)。文本数据文件的头部 可以通过 save_header_format_string 进行配置。

-v7.3
-V7.3
-7.3

Octave 尚未实现以 MATLAB 的 v7.3 二进制数据格式保存。

-v7
-V7
-7
-mat7-binary

MATLAB 的 v7 二进制数据格式保存数据。

-v6
-V6
-6
-mat
-mat-binary

MATLAB 的 v6 二进制数据格式保存数据。

-v4
-V4
-4
-mat4-binary

MATLAB 的 v4 二进制数据格式保存数据。

-zip
-z

使用 gzip 算法压缩文件。这适用于需要在 Octave 之外通过 gzip 压缩的文件,并且 gzip 也可用于转换文件以实现向后兼容性。仅当 Octave 在编译时链接了 zlib 库时,此选项才可用。

要保存的变量列表可以使用包含以下特殊字符的通配符模式(glob 模式):

?

匹配任意单个字符。

*

匹配零个或多个字符。

[ list ]

匹配 list 中指定的字符列表。如果第一个字符是 !^,则匹配除 list 中指定字符以外的所有字符。例如,[a-zA-Z] 将匹配所有小写和大写字母字符。

当使用 -struct 修饰符时,字段名称规范中也可以使用通配符(但结构体名称本身不能使用)。

注意:如果使用特殊的文件名 "-" 调用,则保存的数据将以字符串形式返回,而不是写入实际的文件。

当保存全局变量时,变量的全局状态也会被保存。 如果在保存变量之后,稍后使用 load 恢复该变量,它将以全局变量的形式恢复。 但如果使用 MATLAB 二进制数据文件格式或 -ascii 格式,全局状态不会被保留。

请注意,classdef 对象将以 struct 的形式保存在支持保存 struct 的文件格式中。 这意味着,在稍后从保存的文件中加载变量时,它们将不会作为 classdef 对象加载。

示例:

save -binary data a b*

将变量 a 和所有以 b 开头的变量以 Octave 的二进制格式保存到文件 data 中。

另请参阅: load, save_default_options, save_header_format_string, save_precision, csvwrite, dlmwrite, fwrite.

有三个函数可以修改 save 的行为。

 
val = save_default_options ()
old_val = save_default_options (new_val)
old_val = save_default_options (new_val, "local")

查询或设置内部变量,该变量指定 save 命令的默认参数,并定义默认格式。

默认值为 "-text"(Octave 自有的基于文本的文件格式)。有关其他选项,请参阅 save 命令的文档。

当从函数内部使用 "local" 选项调用时,该变量会在函数及其调用的任何子程序范围内进行本地更改。退出函数时将恢复原始的变量值。

另请参阅: save, save_header_format_string, save_precision.

 
val = save_precision ()
old_val = save_precision (new_val)
old_val = save_precision (new_val, "local")

查询或设置内部变量,该变量指定以文本格式保存数据时要保留的位数。

默认值为 17,这是无损保存和恢复 IEEE 754 双精度值所需的最小值;对于 IEEE 754 单精度值,最小值为 9。如果文件大小是一个问题,那么选择二进制格式来保存数据比降低保存值的精度更好。

当从函数内部使用 "local" 选项调用时,该变量会在函数及其调用的任何子程序范围内进行本地更改。退出函数时将恢复原始的变量值。

另请参阅: save_default_options.

 
val = save_header_format_string ()
old_val = save_header_format_string (new_val)
old_val = save_header_format_string (new_val, "local")

查询或设置内部变量,该变量指定用于 Octave 所保存的文本格式数据文件开头注释行的格式字符串。

格式字符串被传递给 strftime,并且必须以字符 ‘#’ 开头,且不能包含换行符。如果 save_header_format_string 的值是空字符串,则文本格式数据文件中将省略头部注释。默认值为:

"# Created by Octave VERSION, %a %b %d %H:%M:%S %Y %Z"

当从函数内部使用 "local" 选项调用时,该变量会在函数及其调用的任何子程序范围内进行本地更改。退出函数时将恢复原始的变量值。

另请参阅: strftime, save_default_options.

 
load file
load options file
load options file v1 v2 …
S = load ("options", "file", "v1", "v2", …)
load file options
load file options v1 v2 …
S = load ("file", "options", "v1", "v2", …)

从文件 file 中加载指定的变量 v1, v2, …。

如果未指定任何变量,则将加载文件中找到的所有变量。 否则,可以使用完整的变量名或通配符语法来指定要加载的变量。文件的格式会自动检测,但也可以通过提供相应的选项来覆盖。

load 命令也可以使用函数形式调用:

load ("-option1", ..., "file", "v1", ...)

此时,optionsfile 和变量名参数(v1, …)必须指定为字符串。

load 的有效选项如下表所示。

-ascii

强制 Octave 假定文件包含文本格式的数字列,不含任何头部信息或其他信息。文件中的数据将作为单个数值矩阵加载,变量名从文件名派生。

-binary

强制 Octave 假定文件为 Octave 的二进制格式。

-hdf5

强制 Octave 假定文件为 HDF5 格式。(HDF5 是一种由伊利诺伊大学国家超级计算应用中心开发的免费、可移植的二进制格式。) 请注意,load 仅设计用于读取由 Octave 的 save 创建的 HDF5 文件, 尝试读取其他 HDF5 文件可能会失败或产生不可预测的结果。 -hdf5 选项提供了有限的能力来读取使用 MATLAB-v7.3 选项创建的文件(该选项以 HDF5 格式保存), 尽管许多数据类型仍不受支持。此格式仅在 Octave 编译时链接了 HDF5 库的情况下可用。

-text

强制 Octave 假定文件为 Octave 的文本格式。

-v7.3
-V7.3
-7.3

Octave 尚未支持 MATLAB 的 v7.3 二进制数据格式。 由于 v7.3 格式是一种基于 HDF5 的格式,因此可以使用 "-hdf5" 选项 尝试打开 v7.3 格式的文件,但大多数非数值数据类型尚不支持。请注意,Octave 目前不能以这种格式保存。

-v7
-V7
-7
-mat7-binary

强制 Octave 假定文件为 MATLAB 的版本 7 二进制格式。

-v6
-V6
-6
-mat
-mat-binary

强制 Octave 假定文件为 MATLAB 的版本 6 二进制格式。

-v4
-V4
-4
-mat4-binary

强制 Octave 假定文件为 MATLAB 的版本 4 二进制格式。

要加载的变量列表可以使用包含以下特殊字符的通配符模式(glob 模式):

?

匹配任意单个字符。

*

匹配零个或多个字符。

[ list ]

匹配 list 中指定的字符列表。如果第一个字符是 !^,则匹配除 list 中指定字符以外的所有字符。例如,[a-zA-Z] 将匹配所有小写和大写字母字符。

如果使用一个输出参数调用,则 Octave 将加载的数据赋给该输出参数,而不是将变量插入符号表。如果数据文件只包含数字(以制表符或空格分隔的列),则返回一个数值矩阵。否则,load 返回一个结构体,其成员对应于文件中的变量名。

load 命令可以读取 Octave 的文本和二进制格式、MATLAB 的二进制格式以及许多简单格式(例如逗号分隔值(CSV))中存储的数据。如果在编译时启用了 zlib 支持,它还可以加载 gzip 压缩的文件。它会自动检测文件类型并执行不同浮点格式之间的转换(目前仅支持 IEEE 大端和小端,但将来可能会添加其他格式)。

编程说明:如果一个未标记为 global 的变量从文件中加载,而此时已存在同名的全局符号,则该变量将被加载到全局符号表中。同样,如果文件中的某个变量被标记为 global,而本地已存在同名符号,则该本地符号将被移至全局符号表,并赋值为文件中的值。

另请参阅: save, csvread, dlmread, fread, textscan.

 
str = fileread (filename)
str = fileread (filename, param, value, …)

读取 filename 的内容并将其作为字符串返回。

paramvalue 是可选的参数-值对。有效选项包括:

"Encoding"

指定从文件中读取时使用的编码。这是一个有效编码标识符的字符串。默认值为 "utf-8"

另请参阅: fopen, fread, fscanf, importdata, textscan, type.

 
fmtstr = native_float_format ()

以字符串形式返回本机浮点格式。

可以使用类似于 disp 函数将数据写入屏幕的方式将数据写入文件。fdisp 的工作方式与 disp 类似,只是它的第一个参数是由 fopen 创建的文件指针。例如,以下代码将数据写入 ‘myfile.txt’。

fid = fopen ("myfile.txt", "w");
fdisp (fid, "3/8 is ");
fdisp (fid, 3/8);
fclose (fid);

有关如何使用 fopenfclose 的详细信息,请参阅 打开和关闭文件

 
fdisp (fid, x)

在流 fid 上显示 x 的值。

例如:

fdisp (stdout, "The value of pi is:"), fdisp (stdout, pi)

     -| the value of pi is:
     -| 3.1416

请注意,fdisp 的输出总是以换行符结尾。

另请参阅: disp.

Octave 还可以读写矩阵文本文件,例如逗号分隔的列表。

 
dlmwrite (file, M)
dlmwrite (file, M, delim, r, c)
dlmwrite (file, M, key, val …)
dlmwrite (file, M, "-append", …)
dlmwrite (fid, …)

使用分隔符将数值矩阵 M 写入文本文件 file

file 可以是文件名,也可以是由 fopen 返回的可写文件 ID。

参数 delim 指定用于分隔行中值的分隔符。如果未指定分隔符,则使用逗号字符 ‘,’。

参数 r 指定要添加到文件开头的仅包含分隔符的行数。

参数 c 指定每行数据前要添加的分隔符数量。

如果指定了 "-append" 参数,则追加到 file 的末尾。

此外,以下关键字-值对可以出现在参数列表的末尾:

"append"

"on""off"。参见上面的 "-append"

"delimiter"

参见上面的 delim

"newline"

用于分隔每一行的字符。此选项有三种特殊情况:"unix" 被转换为 "\ ""pc" 被转换为 "\r\ ""mac" 被转换为 "\r"。任何其他值都将直接用作换行符。

"roffset"

参见上面的 r

"coffset"

参见上面的 c

"precision"

写入文件时使用的精度。它可以是一个格式字符串(如 fprintf 所使用的),也可以是有效数字的位数。

dlmwrite ("file.csv", reshape (1:16, 4, 4));
dlmwrite ("file.tex", a, "delimiter", "&", "newline", "\
")

另请参阅: dlmread, csvread, csvwrite.

 
data = dlmread (file)
data = dlmread (file, sep)
data = dlmread (file, sep, r0, c0)
data = dlmread (file, sep, range)
data = dlmread (…, "emptyvalue", EMPTYVAL)

从文本文件 file 中读取数值数据,使用 sep 作为数据值之间的分隔符。

如果未指定 sep,则字段之间的分隔符将从文件本身确定。

可选的标量参数 r0c0 定义了要读取数据的起始行和列。这些值从零开始索引,即第一行数据的索引为 0。

range 参数指定要读取的数据元素。该参数的第一种形式是一个包含左上角和右下角坐标的 4 元素向量 [R0,C0,R1,C1],其中索引从零开始。要指定最后一列(相当于 end 索引),请使用值 Inf。或者,也可以使用电子表格样式的形式,如 "A2..Q15""T1:AA5"。最小的字母索引 'A' 表示第一列。最小的行索引为 1。

file 可以是文件名,也可以是由 fopen 返回的文件 ID。在使用文件 ID 的情况下,将一直读取直到文件末尾。

"emptyvalue" 参数可用于指定用于填充空字段的值。默认值为零。请注意,任何非数字值(如文本)也会被替换为 "emptyvalue"

另请参阅: csvread, textscan, dlmwrite.

 
csvwrite (filename, x)
csvwrite (filename, x, dlm_opt1, …)

将数值矩阵 x 以逗号分隔值(CSV)格式写入文件 filename

此函数等效于:

dlmwrite (filename, x, ",", dlm_opt1, ...)

任何可选参数都将直接传递给 dlmwrite(另请参阅 dlmwrite)。

另请参阅: csvread, dlmwrite, dlmread.

 
x = csvread (filename)
x = csvread (filename, dlm_opt1, …)

读取逗号分隔值(CSV)文件 filename 并将其作为矩阵 x 返回。

注意:只能读取包含数值数据的 CSV 文件。

此函数等效于:

x = dlmread (filename, "," , dlm_opt1, ...)

任何可选参数都将直接传递给 dlmread(另请参阅 dlmread)。

另请参阅: dlmread, textscan, csvwrite, dlmwrite.

文本文件中的格式化数据也可以被读取或写入。

 
[a, …] = textread (filename)
[a, …] = textread (filename, format)
[a, …] = textread (filename, format, n)
[a, …] = textread (filename, format, prop1, value1, …)
[a, …] = textread (filename, format, n, prop1, value1, …)

此函数已过时。请改用 textscan

从文本文件中读取数据。

文件 filename 根据 format 进行读取和解析。该函数的行为类似于 strread,但它是通过解析文件而不是字符串来工作的。有关详细信息,请参阅 strread 的文档。

另请参阅: textscan, strread, load, dlmread, csvread.

 
C = textscan (str, format)
C = textscan (str, format, repeat)
C = textscan (fid, format)
C = textscan (fid, format, repeat)
[C, position] = textscan (…)
[C, position] = textscan (str, format, repeat, prop1, value1, …)

从文本文件或字符串中读取数据。

字符串 str 或与文件 ID fid 关联的文件将根据 format 进行解析。该函数是 strreadtextread 的替代品。

输入被解释为一系列单词、分隔符(例如逗号、空格)以及可选的注释文本。输出 C 是一个元胞数组,其中列数等于格式转换说明符的数量。

输入的第一个单词匹配第一个格式说明符,第二个单词匹配第二个说明符,依此类推。当所有说明符都被处理后,对输入的下一个单词重复该过程,直到所有单词都被处理完毕或达到 repeat 所施加的限制。

字符串 format 描述了如何解析输入中的单词。与 fscanf 一样,任何(非空白)文本不是转换说明符的文本都会被正常跳过。

以下是有效的转换说明符:

%f
%f64
%n

将单词解析为数字并转换为 double 类型。

%f32

将单词解析为数字并转换为 single(单精度 float)类型。

%d
%d8
%d16
%d32
%d64

将单词解析为数字并分别转换为 int8、int16、int32 或 int64。如果未指定大小,则使用 int32。

%u
%u8
%u16
%u32
%u64

将单词解析为数字并分别转换为 uint8、uint16、uint32 或 uint64。如果未指定大小,则使用 uint32。

%s

将单词解析为字符串,结束于空白字符、行尾或选项中指定的分隔符之前的最后一个字符。

%q

将单词解析为"带引号的字符串"。如果字符串的第一个字符是双引号("),则该字符串将包含直到匹配的双引号之前的所有内容——包括空格、分隔符和行尾字符。如果输入中出现连续两个双引号,则在输出中将其替换为单个双引号。例如,输入 "He said ""Hello""" 将返回值 'He said "Hello"'。

%c

读取输入的下一个字符。这包括分隔符、空白和行尾字符。

%[…]
%[^…]

在第一种形式中,单词由仅包含括号内字符的最长连续序列组成。字符范围可以用连字符指定;例如,%[0-9a-zA-Z] 匹配所有字母数字字符(如果底层字符集是 ASCII)。由于 MATLAB 将连字符按字面处理,此扩展仅适用于字母数字字符。要在集合中包含 ’-’,应将其放在括号中的第一个或最后一个位置;要包含 ’]’,应将其放在第一个字符。如果第一个字符是 ’^’,则单词由列出的字符组成。

%N…

对于 %s、%c、%d、%f、%n、%u,可以指定可选的宽度,如 %Ns 等,其中 N 是一个大于 1 的整数。对于 %c,这将导致恰好读取 N 个字符而不是单个字符。对于其他说明符,这是读取字符数的上限;普通分隔符可能导致读取更少的字符。对于复数,此限制分别适用于实部和虚部。对于 %f 和 %n,允许使用类似 %N.Mf 的格式说明符,其中 M 是要考虑的小数点后字符数的上限;后续数字将被跳过。例如,说明符 %8.2f 会将 12.345e6 读取为 1.234e7。

%*…

由转换说明符的其余部分指定的单词将被跳过。

literals(字面量)

此外,格式中可以包含字面字符串;这些将在读取时被跳过。如果输入字符串不匹配此字面量,则处理终止。

与第一个说明符对应的解析单词返回到第一个输出参数中,其余说明符依此类推。

默认情况下,如果只有一个输入参数,则 format"%f"。这意味着从输入中读取数字到单个列向量中。如果 format 显式设置为空(""),则 textscan 将返回列数与输入第一行数据字段数匹配的数据。这两种方式仅适用于输入完全是数值时。

例如,字符串:

str = "\
Bunny Bugs   5.5\n\
Duck Daffy  -7.5e-5\n\
Penguin Tux   6"

可以用以下代码读取:

a = textscan (str, "%s %s %f");

可选的数字参数 repeat 可用于限制读取的项目数量:

-1

读取所有字符串或文件直到结束(默认)。

N

读取直到出现两个条件中的第一个:1)格式已处理 N 次,或 2)输入的 N 行已处理。零(0)是 repeat 的可接受值。目前,%q、%c 和 %[…] 转换中的行尾字符不影响行数。这与 MATLAB 不兼容,将来可能会更改。

textscan 的行为可以通过属性/值对进行更改。可以识别以下属性:

"BufSize"

指定用于内部缓冲区的字节数。当读取大文件时,将其设置为一个大值可以获得适度的速度提升,特别是当输入包含长字符串时。默认值为 4096,或者如果指定了 n,则为依赖于 n 的值。

"CollectOutput"

值为 1 或 true 指示 textscan 在输出元胞数组中连接同一类的连续列。值为 0 或 false(默认)时,输出将保留在不同的列中。

"CommentStyle"

指定输入中被视为注释并将被跳过的部分。value 是注释样式,可以是(1)一个字符串或 1×1 元胞字符串,跳过其右边的所有内容;(2)一个由两个字符串组成的元胞数组,跳过第一个字符串和第二个字符串之间的所有内容。注释仅在接受空白的地方进行解析,而不充当分隔符。

"Delimiter"

如果 value 是字符串,则 value 中的任何字符将用于将输入拆分为单词。如果 value 是字符串的元胞数组,则数组中的任何字符串都将用于将输入拆分为单词。(默认值 = 任何空白字符。)

"EmptyValue"

在非空格分隔的数据中,为空的数值返回的值。默认值为 NaN。当数据类型不支持 NaN(例如 int32)时,默认值为零。

"EndOfLine"

value 可以是空字符,也可以是指定行尾字符的一个字符,或者是一对 "\r\n"(CRLF)。在后一种情况下,"\r""\n""\r\n" 中的任何一个都被计为一个(单个)换行符。如果未给出值,则使用 "\r\n"

"HeaderLines"

fid 的前 value 行被跳过。请注意,这不是指第一个非注释行,而是指任何类型的第一行。

"MultipleDelimsAsOne"

如果 value 为非零,则将一系列连续的分隔符(中间没有空白)视为单个分隔符。连续的分隔符序列不需要垂直对齐。没有此选项时,行尾之前的单个分隔符不会导致该行被视为以空值结尾,但行首的单个分隔符会导致该行被视为以空值开头。

"TreatAsEmpty"

value 中出现的单个字符串(用分隔符或空白包围)视为缺失值。

"ReturnOnError"

如果设置为数值 1 或 true,则在遇到错误时立即正常返回,例如尝试使用 %f 读取字符串。如果设置为 0 或 false,则返回错误且不返回数据。

"Whitespace"

value 中的任何字符将被解释为空白并进行修剪。空白的默认值为 " \b\r\n\t"(注意空格)。除非空白被设置为 ""(空)并且至少提供了一个 "%s" 格式转换说明符,否则空格始终是空白的一部分。

strfid 中的单词数量与格式转换说明符数量的精确倍数不匹配时,textscan 的行为取决于字符串或文件的最后一个字符是否是 EndOfLine 选项所指定的行尾:

最后一个字符 = 行尾

数据列用空字段、NaN 或 0(对于整数字段)填充,以使所有列具有相等的长度。

最后一个字符不是行尾

数据列不被填充;textscan 返回长度不等的列。

第二个输出 position 提供处理停止的位置,以字符为单位,从文件或字符串的开头算起。

另请参阅: dlmread, fscanf, load, strread, textread.

importdata 函数能够处理各种各样的数据。

 
A = importdata (fname)
A = importdata (fname, delimiter)
A = importdata (fname, delimiter, header_rows)
[A, delimiter] = importdata (…)
[A, delimiter, header_rows] = importdata (…)

从文件 fname 导入数据。

输入参数:

  • fname — 包含数据的文件名。
  • delimiter — 分隔数据列的字符。使用 \t 表示制表符。(仅适用于 ASCII 文件)
  • header_rows — 数据开始之前的标题行数。(仅适用于 ASCII 文件)

支持不同的文件类型:

  • ASCII 表 — 使用指定的标题行数和指定的分隔符导入 ASCII 表。
  • 图像文件
  • MATLAB 文件
  • 电子表格文件(取决于外部软件)
  • WAV 文件

另请参阅: textscan, dlmread, csvread, load.

导入后,数据可能需要在进一步分析之前进行转换。rescale 函数可以将数据集平移并缩放到指定的范围。

 
B = rescale (A)
B = rescale (A, l, u)
B = rescale (…, "inputmin", inmin)
B = rescale (…, "inputmax", inmax)

将矩阵元素缩放到指定的值范围。

使用单个矩阵参数 A 调用时,重新缩放元素以归一化到区间 [0, 1]。

可选输入 [l, u]A 缩放到具有下界 l 和上界 u 的区间。

可选输入 "inputmin" 将所有小于指定值 inmin 的元素替换为 inmin。类似地,可选参数 "inputmax" 将所有大于指定值 inmax 的元素替换为 inmax。如果未指定,则最小值和最大值从数据本身获取(inmin = min (A(:))inmax = max (A(:)))。

编程说明:应用的公式为 B = l + ((A - inmin) ./ (inmax - inmin)) .* (u - l)

如果输入矩阵 A 是单精度类型,则输出矩阵 B 也是单精度;但对于双精度、整数或逻辑类型的输入,输出为双精度。

另请参阅: bounds, min, max.