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会将所有变量保存在当前作用域中。否则,可以使用完整的变量名或模式语法来指定要保存的变量。如果-结构体的字段标量结构体保存为ifthey-are变量,并具有相应的字段名。这个-结构体参数可以与特定的字段名组合f1, f2,…仅将某些字段写入文件。

的有效参数save命令在下表中列出。修改输出格式的参数将覆盖从指定的格式save_default_options.

如果使用函数形式调用save

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

然后options, file,和变量名参数(v1,…)必须指定为字符串。

如果使用的文件名为"-",如果nargoutis为0,则将输出写入stdout,否则以字符串形式返回输出。

-append

附加到目标,而不是覆盖。

-ascii

将矩阵保存在不带标题或任何其他信息的文本文件中。矩阵必须是二维的,并且只有任何复杂值的实部才会写入文件。数字以单精度格式存储,并用空格分隔。的其他参数-ascii格式为

-double

以双精度格式存储数字。

广告
-tabs

用制表符分隔数字。

广告
广告
-binary

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

广告
-float-binary

以Octave的二进制数据格式保存数据,但仅使用单精度。使用此格式只有如果您知道所有要保存的值都可以用单精度表示。

广告
-hdf5

将数据保存在HDF5format(HDF5是一种免费的、可移植的二进制格式,从伊利诺伊大学的国家超级计算应用中心开发。)只有当Octave是通过链接HDF5依赖库。

广告
-float-hdf5

将数据保存在HDF5格式,但仅使用单一精度。使用此格式只有如果您知道所有要保存的值都可以单精度显示。

广告
-text

以Octave的文本数据格式保存数据。默认

广告
-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]将匹配所有小写和大写字母字符。

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

广告

使用时除外MATLAB二进制数据文件格式或-ascii格式,保存全局变量也会保存变量的全局状态。如果稍后使用“”还原变量加载,它将作为全局变量重新存储。

用例

命令

save -binary data a b*

保存变量和所有以'开头的变量b到文件数据以Octave的二进制格式。

详见: load, save_default_options, save_header_format_string, save_precision, dlmread, csvread, fread.

广告

有三个函数可以修改的行为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 <USER@HOST>"

当从具有的函数内部调用时"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", …)

加载命名变量v1, v2,…,来自文件file.

如果未指定任何变量,则将加载文件中找到的所有变量。与一样save,要提取的变量列表可以是全名,也可以使用模式语法。文件的格式是自动检测到的,但可以通过提供适当的参数来覆盖。

如果使用函数形式调用load

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

然后options, file,和变量名参数(v1,…)必须指定为字符串。

如果一个未符号为全局的变量是在具有相同名称的全局符号已经存在的情况下从文件中加载的,则会将其加载到全局符号表中。此外,如果一个变量在文件中符号为全局,并且存在局部符号,则局部符号会移动到全局符号表中,并从文件中给定值。

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

这个load命令可以读取以Octave的文本和二进制格式存储的数据,以及MATLAB的二进制格式。如果使用zlibsupport编译,它还可以加载gzip压缩文件。它将自动检测文件类型,并从不同的浮点格式进行转换(目前只有IEEE big和little endian,但未来可能会添加其他格式)。

的有效参数load下表中列出了。

-force

此参数可用于向后兼容性,但会被忽略。Octave现在用文件中相同名称的变量覆盖当前内存中的变量。

广告
-ascii

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

广告
-binary

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

广告
-hdf5

强制Octave假定文件为HDF5格式(HDF5是一种免费的、可移植的二进制格式,从伊利诺伊大学国家超级计算应用中心开发。) 注意:load只被设计用于 读取用save保存的HDF5文件, 而且尝试读取其他的 HDF5 文件可能失败或者生成不可预测的 结果。-hdf5 选项还提供一个有限的能力去读取 使用MATLAB-v7.3 选项生成的文件 (保存为HDF5 格式) ,尽管很多数据类型仍然不支持。这个格式只在 Octave 在编译时链接 HDF5 依赖库时才可用.

广告
-import

此参数可用于向后兼容性,但会被忽略。Octave现在可以支持多维HDF数据,如果变量名是无效的Octave标识符,则可以自动修改变量名。

广告
-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二进制格式。

广告

详见: save, dlmwrite, csvwrite, fwrite.

广告
 
: str = fileread (filename)
: str = fileread (filename, param, value, …)

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

param, value是可选的参数和值对。有效参数包括:

"Encoding"

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

广告

详见: fopen, fread, fscanf, importdata, textscan, type.

广告
 
: fmtstr = native_float_format ()

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

广告

可以以类似于的方式将数据写入文件disp用于将数据写入屏幕的函数。这个fdisp工作原理就像disp除了它的第一个参数是从创建的文件pointerasfopen。例如,以下代码写入数据myfile.txt’.

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

详见打开和关闭文件,了解如何使用的详细信息fopenfclose.

 
: fdisp (fid, x)

显示的值x在溪流上fid.

例如

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应该是从给定的文件名或可写文件IDfopen.

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

的值r指定要添加到文件开头的仅限分隔符的行数。

的值c指定每行数据前要加的分隔符数。

如果参数"-append"的末尾file.

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

"append"

任何一个"on""off"详见"-append"在上面

广告
"delimiter"

详见delim在上面

广告
"newline"

用于分隔每一行的字符。此参数有三种特殊情况。"unix"被更改为"\n","pc"被更改为"\r\n""mac"被更改为"\r"。任何其他值都直接用作换行符。

广告
"roffset"

详见r在上面

广告
"coffset"

详见c在上面

广告
"precision"

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

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

详见: 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定义要读取的数据的起始行和列。这些值从零开始索引,即,第一数据行对应于零的索引。

这个range参数指定读取哪些数据元素。参数的第一种形式是包含左上角和右下角的4元素向量[R0,C0,R1,C1]其中索引是基于零的。指定最后一列——相当于end索引时--使用值Inf。或者,aspreadsheet样式的表单,例如"A2..Q15""T1:AA5"可以使用。最低字母索引'A'指第一列。最低的行索引为1。

file应该是从给定的文件名或文件idfopen。在较低的情况下,读取文件直到到达文件末尾。

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

详见: csvread, textscan, dlmwrite.

广告
 
: csvwrite (filename, x)
: csvwrite (filename, x, dlm_opt1, …)

编写数字矩阵x到文件filename不可分数值 (CSV)格式。

此函数等效于

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详细信息。

除了支持的参数之外strread,此函数还支持两个:

可选输入n(格式重复计数)指定要使用格式字符串的次数或要读取的行数,以读取时先发生的为准。前者相当于要求数据输出向量的长度N注意,当读取具有引用多行的格式字符串的文件时,n应该是要读取的行数,而不是字符串使用的格式数。

如果格式字符串为空(不仅仅是被省略),并且文件只包含数字数据(不包括头行),textread将返回一个矩形矩阵,其列数与文件第一行数据上的数字字段数相匹配。空字段将作为零值返回。

示例:

  Assume a data file like:
  1 a 2 b
  3 c 4 d
  5 e
  [a, b] = textread (f, "%f %s")
  returns two columns of data, one with doubles, the other a
  cellstr array:
  a = [1; 2; 3; 4; 5]
  b = {"a"; "b"; "c"; "d"; "e"}
  [a, b] = textread (f, "%f %s", 3)
  (read data into two culumns, try to use the format string
  three times)
  returns
  a = [1; 2; 3]
  b = {"a"; "b"; "c"}

  With a data file like:
  1
  a
  2
  b

  [a, b] = textread (f, "%f %s", 2)
  returns a = 1 and b = {"a"}; i.e., the format string is used
  only once because the format string refers to 2 lines of the
  data file.  To obtain 2x1 data output columns, specify N = 4
  (number of data lines containing all requested data) rather
  than 2.

详见: textscan, load, dlmread, fscanf, strread.

广告
 
: C = textscan (fid, format)
: C = textscan (fid, format, repeat)
: C = textscan (fid, format, param, value, …)
: C = textscan (fid, format, repeat, param, value, …)
: C = textscan (str, …)
: [C, position, errmsg] = textscan (…)

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

字符串str或与关联的文件fid读取并根据format。该函数是的扩展strreadtextread。差异包括:从文件或字符串中读取的能力、附加参数和附加格式值。

输入被解释为单词、分隔符(如空白)和文字的序列。构成分隔符和空白的字符从参数决定。格式从散布在文字之间的格式值组成。在该格式中,空白是连续文字之间的分隔符,但在其他情况下会被忽略。

输出C是一个元胞数组,其中列的数量从格式值的数量决定。

输入的第一个字与格式的第一个值匹配,并放置在输出的第一列中;第二个与第二个值匹配并放在第二列中,依此类推。如果单词多于值,则重复该过程,直到所有单词都已处理完毕或达到repeat已满足(见下文)。

字符串format描述中的单词str应该进行解析。如中所示fscanf,任何非这些值格式的(非空白)文本都被视为文本。如果两个格式值之间有一个文字,那么相同的文字必须出现在匹配单词之间的输入流中。

以下值有效:

%f
%f64
%n

该单词被解析为数字并转换为双精度。

广告
%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

此外,该格式可能包含文字字符串;这些将在阅读过程中跳过。如果输入字符串与此文字不匹配,则处理终止。

广告

对应于第一个值的解析词在第一个输出参数中返回,对于其余的值也是如此。

默认情况下,如果只有一个输入参数,formatf这意味着数字从输入读取到单列向量中。如果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如果指定了。

广告
"CollectOutput"

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

广告
"CommentStyle"

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

广告
"Delimiter"

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

广告
"EmptyValue"

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

广告
"EndOfLine"

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

广告
"HeaderLines"

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

广告
"MultipleDelimsAsOne"

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

广告
"TreatAsEmpty"

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

广告
"ReturnOnError"

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

广告
"Whitespace"

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

广告

当中的字数strfid与格式转换值数量的精确倍数不匹配,textscansbehavior取决于字符串或文件的最后一个字符是否为EndOfLine参数

last character = end-of-line

数据列填充有空字段,NaN或0(对于整数字段),因此所有列的长度相等

广告
last character is not end-of-line

数据列未填充;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.

输入参数:

支持不同的文件类型:

详见: 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。同样,optionalinput"inputmax"替换所有大于指定值的元素inmax具有inmax.如果未指定,则从数据本身获取的最小值和最大值(inmin=最小值(A(:)) 和inmax=最大值(A(:)) ).

编程说明:应用的公式为

B= l+ ((A- inmin) ./ (inmax- inmin)).* (u- l)

输出矩阵的类B如果输入为单一Aissingle,但对于双精度、整数或逻辑类型的输入,它属于双精度类。

详见: bounds, min, max.

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2