save 和 load 命令允许以各种格式向磁盘文件写入数据以及从磁盘文件读取数据。save 命令写入文件的默认格式可以通过 save_default_options 和 save_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
file ¶options file ¶options file v1 v2 … ¶options file -struct STRUCT ¶options file -struct STRUCT f1 f2 … ¶- v1 v2 … ¶str = save ("-", "v1", "v2", …) ¶将指定的变量 v1, v2, … 保存到文件 file 中。
如果未列出变量名,则 Octave 保存当前作用域中的所有变量。 否则,可以使用完整的变量名或通配符语法来指定要保存的变量。 如果使用了 -struct 修饰符,则标量结构体的字段将被保存,如同它们是以相应字段名为名的变量一样。 -struct 选项可以与特定的字段名 f1, f2, … 组合使用,以仅将特定的字段写入文件。
save 命令也可以使用函数形式调用:
save ("-option1", ..., "file", "v1", ...)
此时,options、file 和变量名参数(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.3Octave 尚未实现以 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.
file ¶options file ¶options file v1 v2 … ¶S = load ("options", "file", "v1", "v2", …) ¶file options ¶file options v1 v2 … ¶S = load ("file", "options", "v1", "v2", …) ¶从文件 file 中加载指定的变量 v1, v2, …。
如果未指定任何变量,则将加载文件中找到的所有变量。 否则,可以使用完整的变量名或通配符语法来指定要加载的变量。文件的格式会自动检测,但也可以通过提供相应的选项来覆盖。
load 命令也可以使用函数形式调用:
load ("-option1", ..., "file", "v1", ...)
此时,options、file 和变量名参数(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.3Octave 尚未支持 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,而本地已存在同名符号,则该本地符号将被移至全局符号表,并赋值为文件中的值。
str = fileread (filename) ¶str = fileread (filename, param, value, …) ¶读取 filename 的内容并将其作为字符串返回。
param、value 是可选的参数-值对。有效选项包括:
"Encoding"指定从文件中读取时使用的编码。这是一个有效编码标识符的字符串。默认值为 "utf-8"。
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);
有关如何使用 fopen 和 fclose 的详细信息,请参阅 打开和关闭文件。
(fid, x) ¶在流 fid 上显示 x 的值。
例如:
fdisp (stdout, "The value of pi is:"), fdisp (stdout, pi)
-| the value of pi is:
-| 3.1416
请注意,fdisp 的输出总是以换行符结尾。
另请参阅: disp.
Octave 还可以读写矩阵文本文件,例如逗号分隔的列表。
(file, M) ¶(file, M, delim, r, c) ¶(file, M, key, val …) ¶(file, M, "-append", …) ¶(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", "\
")
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,则字段之间的分隔符将从文件本身确定。
可选的标量参数 r0 和 c0 定义了要读取数据的起始行和列。这些值从零开始索引,即第一行数据的索引为 0。
range 参数指定要读取的数据元素。该参数的第一种形式是一个包含左上角和右下角坐标的 4 元素向量 [R0,C0,R1,C1],其中索引从零开始。要指定最后一列(相当于 end 索引),请使用值 Inf。或者,也可以使用电子表格样式的形式,如 "A2..Q15" 或 "T1:AA5"。最小的字母索引 'A' 表示第一列。最小的行索引为 1。
file 可以是文件名,也可以是由 fopen 返回的文件 ID。在使用文件 ID 的情况下,将一直读取直到文件末尾。
"emptyvalue" 参数可用于指定用于填充空字段的值。默认值为零。请注意,任何非数字值(如文本)也会被替换为 "emptyvalue"。
(filename, x) ¶(filename, x, dlm_opt1, …) ¶将数值矩阵 x 以逗号分隔值(CSV)格式写入文件 filename。
此函数等效于:
dlmwrite (filename, x, ",", dlm_opt1, ...)
任何可选参数都将直接传递给 dlmwrite(另请参阅 dlmwrite)。
x = csvread (filename) ¶x = csvread (filename, dlm_opt1, …) ¶读取逗号分隔值(CSV)文件 filename 并将其作为矩阵 x 返回。
注意:只能读取包含数值数据的 CSV 文件。
此函数等效于:
x = dlmread (filename, "," , dlm_opt1, ...)
任何可选参数都将直接传递给 dlmread(另请参阅 dlmread)。
文本文件中的格式化数据也可以被读取或写入。
[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 的文档。
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 进行解析。该函数是 strread 和 textread 的替代品。
输入被解释为一系列单词、分隔符(例如逗号、空格)以及可选的注释文本。输出 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 次,或 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" 格式转换说明符,否则空格始终是空白的一部分。
当 str 或 fid 中的单词数量与格式转换说明符数量的精确倍数不匹配时,textscan 的行为取决于字符串或文件的最后一个字符是否是 EndOfLine 选项所指定的行尾:
数据列用空字段、NaN 或 0(对于整数字段)填充,以使所有列具有相等的长度。
数据列不被填充;textscan 返回长度不等的列。
第二个输出 position 提供处理停止的位置,以字符为单位,从文件或字符串的开头算起。
importdata 函数能够处理各种各样的数据。
A = importdata (fname) ¶A = importdata (fname, delimiter) ¶A = importdata (fname, delimiter, header_rows) ¶[A, delimiter] = importdata (…) ¶[A, delimiter, header_rows] = importdata (…) ¶从文件 fname 导入数据。
输入参数:
\t 表示制表符。(仅适用于 ASCII 文件)支持不同的文件类型:
导入后,数据可能需要在进一步分析之前进行转换。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 也是单精度;但对于双精度、整数或逻辑类型的输入,输出为双精度。