如何防止 Octave 对行向量和列向量求和?

How to prevent Octave from summing row and column vectors?

在Octave中,一般情况下,'+'只有在两个操作数具有相同维度时才有效。

这个规则似乎有一个例外:如果你'+'一个行向量(1 x n)和一个列向量(n x 1),Octave将产生一个(合理)维度矩阵(n x n):

>> a = [1, 2, 3, 4, 5]
a =

   1   2   3   4   5

>> b = [1; 2; 3; 4; 5]
b =

   1
   2
   3
   4
   5

>> a+b
ans =

    2    3    4    5    6
    3    4    5    6    7
    4    5    6    7    8
    5    6    7    8    9
    6    7    8    9   10

是否可以避免这种情况,或者至少可以发出警告?这似乎有潜在的不安全性;我最近被一个被这种行为掩盖的错误所困扰。

谢谢!

不,这是无法避免的。您需要检查函数的输入。你说的异常不是异常,是语言语法。

逐元素运算要求维度具有相等长度或长度为一的维度。您试图阻止的功能也是使这项工作有效的功能:

octave:1> a = 1:4
a =

   1   2   3   4

octave:2> a+1
ans =

   2   3   4   5

octave:3> a == 2
ans =

  0  1  0  0

在上面的例子中,长度为1(1x1)的维度中的值被广播或展开。此功能在 Octave 和 Python 中称为 Broadcasting,在 Matlab 中称为 Implicit Expansion。有一堆运算符和函数,例如 ==max 也广播。

有一段时间,在 Octave 3.6 和 3.8 中,可以通过将 Octave:broadcast 变成错误来禁用它。但是,由于语言中处理错误的方式,这实际上使所有使用广播的 Octave 函数都出错了。