4.1 矩阵

在 Octave 中定义一个数值矩阵非常容易。矩阵的大小会自动确定,因此无需显式声明其维度。表达式

a = [1, 2; 3, 4]

得到矩阵


        /      \
        | 1  2 |
  a  =  |      |
        | 3  4 |
        \      /

矩阵的元素可以是任意表达式,前提是在组合各个部分时维度都是有意义的。例如,给定上述矩阵,表达式

[ a, a ]

生成矩阵

ans =

   1  2  1  2
   3  4  3  4

但是表达式

[ a, 1 ]

会产生错误

error: number of rows must match (1 != 2) near line 13, column 6

(当然,这里假设该表达式是第 13 行的第一个内容)。

在界定矩阵表达式的方括号内,Octave 会根据周围的上下文来判断空格和换行符是应转换为元素分隔符和行分隔符,还是应简单地忽略。因此,像这样的表达式

a = [ 1 2
      3 4 ]

是可以正常工作的。然而,仍然存在一些可能的混淆来源。例如,在表达式

[ 1 - 1 ]

中,‘-’ 被视为二元运算符,结果为标量 0;但在表达式

[ 1 -1 ]

中,‘-’ 被视为一元运算符,结果为向量 [ 1, -1 ]。类似地,表达式

[ sin (pi) ]

将被解析为

[ sin, (pi) ]

并且会导致错误,因为 sin 函数被调用时没有传入参数。要解决此问题,必须省略 sin 和左括号之间的空格,或者将整个表达式括在一组括号中:

[ (sin (pi)) ]

单引号字符(‘'’,用作转置运算符和字符串定界符)周围的空白也可能导致混淆。给定 a = 1,表达式

[ 1 a' ]

会使单引号字符被视为转置运算符,结果为向量 [ 1, 1 ];但是表达式

[ 1 a ' ]

会产生错误消息

parse error:

  syntax error

>>> [ 1 a ' ]
              ^

因为如果不这样处理,在解析有效表达式时就会引起麻烦

[ a 'foo' ]

为了清晰起见,最好始终使用逗号和分号来分隔矩阵元素和行。

矩阵中元素的最大数量是在编译 Octave 时确定的。允许的数量可以通过 sizemax 函数查询。请注意,其他因素(例如机器上可用的内存量)可能会将矩阵的最大大小限制为更小的值。

 
max_numel = sizemax ()

返回数组大小所允许的最大值。

如果使用 64 位索引编译 Octave,则结果的类别为 int64,否则为 int32。最大数组大小略小于 intmax 所报告的相应类允许的最大值。

另请参阅:intmax.

当您输入一个矩阵,或者输入值为矩阵的变量名时,Octave 会以整齐对齐的行和列打印出矩阵作为响应。如果矩阵的行太宽而无法在屏幕上完整显示,Octave 会拆分矩阵,并在每个部分之前显示一个标题,指示当前正在显示的列。您可以使用以下变量来控制输出的格式。

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

查询或设置内部变量,该变量指定数值输出显示的最少有效数字位数。

请注意,无论为 output_precision 设置什么值,双精度值显示的精度位数限制为 16 位,单精度值限制为 7 位。此外,调用更改数值显示的 format 函数也可能会更改 output_precision 的设定值。

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

另请参阅:formatfixed_point_format.

通过使用不同的 output_precision 值,可以实现多种输出样式。合理的组合可以通过 format 函数来设置。请参阅 基本输入与输出

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

查询或设置内部变量,该变量控制当显示到终端窗口时是否允许拆分矩阵的行。

如果拆分行,Octave 将以一系列较小的部分显示矩阵,每个部分都能适应终端宽度的限制,并且每组行都带有标签,以便您轻松查看当前正在显示的列。例如:

octave:13> rand (2,10)
ans =

 Columns 1 through 6:

   0.75883  0.93290  0.40064  0.43818  0.94958  0.16467
   0.75697  0.51942  0.40031  0.61784  0.92309  0.40201

 Columns 7 through 10:

   0.90174  0.11854  0.72313  0.73326
   0.44672  0.94303  0.56564  0.82150

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

另请参阅:format.

当数值变得非常大或非常小时,Octave 会自动切换到科学记数法。这样可以保证您看到矩阵中每个值的若干有效数字。如果您希望看到矩阵中的所有值都以定点格式打印,可以使用 fixed_point_format 函数。但不建议这样做,因为它可能产生容易被误解的输出。

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

查询或设置内部变量,该变量控制 Octave 是否使用缩放格式打印矩阵值。

缩放格式会在输出的第一行打印一个缩放因子,确保最大的矩阵元素可以用单个前导数字表示。例如:

fixed_point_format (true)
logspace (1, 7, 5)'
ans =

  1.0e+07  *

  0.00000
  0.00003
  0.00100
  0.03162
  1.00000

请注意,第一个值显示为 0,而实际为 1。由于存在混淆的可能性,您应谨慎启用 fixed_point_format

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

另请参阅:formatoutput_precision.


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

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