5.4.2 数值数据与字符串

除了字符串连接函数(参见 连接字符串)将数值数据转换为相应的 UTF-8 编码字符外,还有几个将数值数据格式化为字符串的函数。mat2strnum2str 用于转换实数矩阵或复数矩阵,而 int2str 转换整数矩阵。int2str 取复数值的实部,并将小数值四舍五入为整数。将数值数据格式化为字符串更灵活的方法是使用 sprintf 函数(参见 格式化输出sprintf)。

 
s = mat2str (x)
s = mat2str (x, n)
s = mat2str (x, [n1, n2])
s = mat2str (…, "class")

将实数矩阵、复数矩阵和逻辑矩阵格式化为字符串。

返回的字符串可以通过 eval 函数用于重构原始矩阵。

值的精度由 n 指定。如果 n 是标量,则矩阵的实部和虚部以相同精度输出。否则,n(1) 定义实部的精度,n(2) 定义虚部的精度。n 的默认值为 15。

如果指定了参数 "class",则 x 的类别会包含在字符串中,使得 eval 将构造出相同类别的矩阵。

mat2str (pi)
     ⇒  "3.14159265358979"

mat2str (pi, 5)
     ⇒  "3.1416"

mat2str ([ -1/3 + i/7; 1/3 - i/7 ], [4 2])
     ⇒  "[-0.3333+0.14i;0.3333-0.14i]"

mat2str ([ -1/3 +i/7; 1/3 -i/7 ], [4 2])
     ⇒  "[-0.3333+0i 0+0.14i;0.3333+0i -0-0.14i]"

mat2str (int16 ([1 -1]), "class")
     ⇒  "int16([1 -1])"

mat2str (logical (eye (2)))
     ⇒  "[true false;false true]"

isequal (x, eval (mat2str (x)))
     ⇒  1

参见: sprintf, num2str, int2str.

 
str = num2str (x)
str = num2str (x, precision)
str = num2str (x, format)

将数字(或数组)转换为字符串(或字符数组)。

可选的第二个参数可以指定输出中使用的有效数字位数(precision),或者指定一个格式模板字符串(format),如 sprintf(参见 格式化输出)。num2str 也可以处理复数。

示例:

num2str (123.456)
  ⇒  123.456

num2str (123.456, 4)
  ⇒  123.5

s = num2str ([1, 1.34; 3, 3.56], "%5.1f")
  ⇒  s =
       1.0  1.3
       3.0  3.6
whos s
  ⇒  Variables in the current scope:
        Attr Name        Size                     Bytes  Class
        ==== ====        ====                     =====  =====
             s           2x8                         16  char
     Total is 16 elements using 16 bytes

num2str (1.234 + 27.3i)
  ⇒  1.234+27.3i

num2str 函数不够灵活。为了更好地控制结果,请使用 sprintf(参见 格式化输出)。

编程说明:

为了与 MATLAB 兼容,返回字符串前会去除前导空格。

大于 flintmax 的整数可能无法正确显示。

对于复数 x,格式字符串只能包含一个输出转换说明符,不能有其他内容。否则,结果将不可预测。

程序员指定的任何可选 format 都将原样使用。这与 MATLAB 不同,后者会基于内部启发式方法修改 format

参见: sprintf, int2str, mat2str.

 
str = int2str (n)

将整数(或整数数组)转换为字符串(或字符数组)。

int2str (123)
  ⇒  123

s = int2str ([1, 2, 3; 4, 5, 6])
  ⇒  s =
        1  2  3
        4  5  6

whos s
  ⇒  Variables in the current scope:
        Attr Name        Size                     Bytes  Class
        ==== ====        ====                     =====  =====
             s           2x7                         14  char
     Total is 14 elements using 14 bytes

该函数不够灵活。为了更好地控制结果,请使用 sprintf(参见 格式化输出)。

编程说明:

非整数在显示前会四舍五入为整数。只显示复数的实部。

参见: sprintf, num2str, mat2str.

 
d = str2double (str)

将字符串转换为实数或复数。

字符串必须是以下格式之一,其中 a 和 b 是实数,复数单位是 'i''j'

  • a + bi
  • a + b*i
  • a + i*b
  • bi + a
  • b*i + a
  • i*b + a

如果存在,a 和/或 b 的格式为 [+-]d[,.]d[[eE][+-]d],其中方括号表示可选参数,'d' 表示零个或多个数字。特殊输入值 InfNaNNA 也被接受。

str 可以是字符串、字符矩阵或元胞数组。对于字符数组,转换对每一行重复进行,并返回双精度或复数数组。s 中的空行会被删除,不会出现在数值数组中。对于元胞数组,每个字符串元素都会被处理,并返回与 str 相同维度的双精度或复数数组。

对于不可转换的标量或字符串输入,str2double 返回 NaN。类似地,对于字符数组输入,str2doubles 中任何无法转换的行返回 NaN。对于元胞数组,str2doubles 中转换失败的任何元素返回 NaN。请注意,混合字符串/数值元胞数组中的数值元素不是字符串,这些元素的转换将失败并返回 NaN。

编程说明:str2double 可以替代 str2num,效率更高,并且避免了在未知数据上使用 eval 的安全风险。

参见: str2num.

 
x = str2num (s)
[x, state] = str2num (s)

将字符串(或字符数组)s 转换为数字(或数组)。

示例:

str2num ("3.141596")
      ⇒  3.141596

str2num (["1, 2, 3"; "4, 5, 6"])
      ⇒  1  2  3
         4  5  6

可选的第二个输出参数 state 在转换成功时为逻辑真(true)。如果转换失败,数值输出 x 为空,state 为假(false)。

注意: 由于 str2num 使用 eval 函数进行转换,str2num 将执行字符串 s 中包含的任何代码。请使用 str2double 以获得更安全、更快的转换。

对于字符串元胞数组,请使用 str2double

参见: str2double, eval.

 
d = bin2dec (str)

返回与字符串 str 所表示的二进制数对应的十进制数。

例如:

bin2dec ("1110")
     ⇒  14

转换过程中会忽略空格,空格可用于使二进制数更具可读性。

bin2dec ("1000 0001")
     ⇒  129

如果 str 是字符串矩阵,则返回列向量,str 的每一行对应一个转换后的数字;无效行评估为 NaN。

如果 str 是字符串元胞数组,则返回列向量,str 中的每个元胞元素对应一个转换后的数字。

参见: dec2bin, base2dec, hex2dec.

 
bstr = dec2bin (d)
bstr = dec2bin (d, len)

返回一个由 1 和 0 组成的字符串,表示将整数 d 转换为二进制数的结果。

如果 d 是矩阵或元胞数组,则返回一个字符串矩阵,d 中的每个元素对应一行,并用前导零填充到最大值的宽度。

可选的第二个参数 len 指定结果的最小位数。

对于 d 的负数元素,返回其补码的二进制值。结果会根据输入的幅度,用前导 1 填充到 8、16、32 或 64 位。正数输入元素则用前导零填充到相同宽度。

示例:

dec2bin (14)
     ⇒  "1110"

dec2bin (-14)
     ⇒  "11110010"

编程提示:dec2bin 会丢弃输入的小数部分。如果需要同时转换小数部分,请使用非零小数位数的 dec2base。你也可以对小数输入使用 fixround 来确保可预测的舍入行为。

参见: bin2dec, dec2base, dec2hex.

 
hstr = dec2hex (d)
hstr = dec2hex (d, len)

返回一个字符串,表示将整数 d 转换为十六进制(基数为 16)数的结果。

如果 d 为负数,则返回 d 的十六进制补码。

如果 d 是矩阵或元胞数组,则返回一个字符串矩阵,d 中的每个元素对应一行,并用前导零填充到最大值的宽度。

可选的第二个参数 len 指定结果的最小位数。

示例:

dec2hex (2748)
     ⇒  "ABC"

dec2hex (-2)
     ⇒  "FE"

编程提示:dec2hex 会丢弃输入的小数部分。如果需要同时转换小数部分,请使用非零小数位数的 dec2base。你也可以对小数输入使用 fixround 来确保可预测的舍入行为。

参见: hex2dec, dec2base, dec2bin.

 
d = hex2dec (str)

返回与字符串 str 所表示的十六进制数对应的整数。

例如:

hex2dec ("12B")
      ⇒  299
hex2dec ("12b")
      ⇒  299

如果 str 是字符串矩阵,则返回列向量,str 的每一行对应一个转换后的数字;无效行评估为 NaN。

如果 str 是字符串元胞数组,则返回列向量,str 中的每个元胞元素对应一个转换后的数字。

参见: dec2hex, base2dec, bin2dec.

 
str = dec2base (d, base)
str = dec2base (d, base, len)
str = dec2base (d, base, len, decimals)

返回一个以基数为 base 的符号字符串,对应于值 d

dec2base (123, 3)
   ⇒  "11120"

如果 d 为负数,则结果将以补码表示法表示 d。例如,负二进制数用二补码表示,其他基数依此类推。

如果 d 是矩阵或元胞数组,则返回一个字符串矩阵,d 中的每个元素对应一行,并用前导零填充到最大值的宽度。

如果 base 是字符串,则 base 的字符被用作 d 的数字符号。空白字符(空格、制表符、换行符等)不能用作符号。

dec2base (123, "aei")
   ⇒  "eeeia"

可选的第三个参数 len 指定结果整数部分的最小位数。如果省略此参数,则 dec2base 使用足够多的位数来容纳输入。

可选的第四个参数 decimals 指定表示输入小数部分的位数。如果省略此参数,则设为零,并且 dec2base 为了向后兼容返回整数输出。

dec2base (100*pi, 16)
⇒  "13A"
dec2base (100*pi, 16, 4)
⇒  "013A"
dec2base (100*pi, 16, 4, 6)
⇒  "013A.28C59D"
dec2base (-100*pi, 16)
⇒  "EC6"
dec2base (-100*pi, 16, 4)
⇒  "FEC6"
dec2base (-100*pi, 16, 4, 6)
⇒  "FEC5.D73A63"

编程提示:将负数输入传递给 dec2base 时,最好明确指定所需输出的长度。

参见: base2dec, dec2bin, dec2hex.

 
d = base2dec (str, base)

str 从基数为 base 的数字字符串转换为十进制整数(基数为 10)。

base2dec ("11120", 3)
   ⇒  123

如果 str 是字符串矩阵,则返回列向量,str 的每一行对应一个值。如果某行包含无效符号,则对应值将为 NaN。

如果 str 是字符串元胞数组,则返回与 str 维度相同的数值数组。

如果 base 是字符串,则 base 的字符被用作 str 的数字符号。' '(空格)可能被用作为数字符号,但 str 中的数字之间必须用空格分隔,以避免数字符号被误认为是分隔符。

参见: dec2base, hex2dec, bin2dec.

 
[a, b, …] = strread (str)
[a, b, …] = strread (str, format)
[a, b, …] = strread (str, format, format_repeat)
[a, b, …] = strread (str, format, format_repeat, option_name, value, …)
[a, b, …] = strread (str, format, option_name, value, …)

将字符串 str 中的数据按 format 读取并返回到 ab 等变量中。当匹配到多个值时,ab 等变量必须具有相同的大小。

format 字符串中,支持类似于 fscanf 的格式说明符。有关更多信息,请参见 格式化输入。如果没有指定 format,则使用所有转换说明符的组合,默认值为 "%f"。这意味着默认情况下读取数字。但是,这也意味着如果没有找到数值,strread 可能会返回空值。

格式字符串中的空格(空格、制表符等)会导致输入中匹配零个或多个空白字符。在格式字符串中,连续的空格字符等同于一个空格。

在格式字符串中,存在一个忽略标志("*")以避免输出中对应结果。任何非格式字符(如文本)都会被原样读入。

如果 format 为空(即 ""' '),并且 str 是一个字符数组或字符串,则 str 被分割为单独的输出参数,其中参数类型由 str 本身确定。

格式重复次数控制读取数据块的重复次数。它可以是整数或 Inf(默认值)。

strread 支持的选项名称/值对参数:

"commentstyle"

支持 value 的部分规范(行尾注释匹配到最近的换行符,而不是行尾):

  • "shell"# 字符到最近的换行符之间的所有内容被跳过。
  • "c" /**/ 之间的所有内容被跳过。
  • "c++"// 字符到最近的换行符之间的所有内容被跳过。
  • "matlab"% 字符到最近的换行符之间的所有内容被跳过。
  • 用户提供。两种选项: (1) 一个字符串,或 1x1 元胞字符串:跳过其右侧的所有内容; (2) 2x1 元胞字符串数组:左右字符串之间的所有内容被跳过。
"delimiter"

value 中的任何字符都将用于将 str 分割成单词(默认值 = 任何空白字符)。注意,除非提供了 "%s" 格式转换说明符,否则空白字符会隐式添加到分隔符集合中;请参见下面的 "whitespace" 参数。分隔符集合不能为空;如果需要,Octave 会用空格作为替代分隔符。

"emptyvalue"

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

"multipledelimsasone"

将连续多个分隔符(中间没有空白)视为一个分隔符。连续的分隔符序列不需要垂直 "aligned"

"treatasempty"

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

"returnonerror"

如果 value 为真(1,默认值),忽略读取错误并正常返回。如果为假(0),则返回错误。

"whitespace"

value 中的任何字符都将被解释为空白并进行修剪;定义空白的字符串必须用双引号括起来,以便正确处理像 "\t" 这样的特殊字符。在每个数据字段中,多个连续的空白字符会被合并为一个空格,并且前导和尾随的空白会被删除。空白的默认值为 " \b\r\n\t" (注意空格)。除非至少提供了一个 "%s" 格式转换说明符,否则空白字符总是被添加到分隔符集合中;在这种情况下,只有显式指定在 "delimiter" 中的空白才会作为分隔符保留,并从空白字符集合中移除。如果要保持空白字符原样(例如在字符串中),请为 "whitespace" 指定空值(即 "");显然,此时空白不能作为分隔符。

str 中的单词数量与格式转换说明符的数量不精确匹配时,strread 的行为取决于 str 的最后一个字符:

最后一个字符 = "\n"

数据列用空字段或 NaN 填充,使所有列长度相等

最后一个字符不是 "\n"

数据列不填充;strread 返回长度不等的列

参见: textscan, sscanf.


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

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