如何防止 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 函数都出错了。
在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 函数都出错了。