在Julia中将标量添加到数组

10

尝试获取一个线性方程 y = m*x + c。我有以下代码行,试图向数组添加一个标量。

m = 1.1; c = 0.11;
x = rand(1,2)
  1×2 Array{Float64,2}:
  0.920045  0.660015

y = m*x + c
ERROR: MethodError: no method matching +(::Array{Float64,2}, ::Float64)
Closest candidates are:
  +(::Any, ::Any, ::Any, ::Any...) at operators.jl:502
  +(::Bool, ::T<:AbstractFloat) where T<:AbstractFloat at bool.jl:112
  +(::Float64, ::Float64) at float.jl:395
  ...
Stacktrace:
 [1] top-level scope at none:0

目前使用的是 Julia 1.0 版本。直接将标量添加到数组中无效。我猜在以前的版本中这是可以的。

标量乘法有效。

m*x
 1×2 Array{Float64,2}:
 1.01205  0.726016

但我需要定义另一个数组,然后执行如下加法。

c = [0.11 0.11]
y = m*x + c
1×2 Array{Float64,2}:
 1.12205  0.836016

这不是多余的吗?在数组上执行标量乘法m*x与加法有什么区别?

2个回答

16

我想这已经变得更加严格了。 在Julia语法(如MATLAB中)中,+*作用于同余数组。

对于逐元素操作,您应该使用.+.*。 奇怪的是,这似乎对*没有影响,但对+有影响。

无论如何,以下两者都有效:

y = m * x .+ c

和:

y = m .* x .+ c

6
对于 * 来说并没有关系,因为矩阵乘以标量是一种定义良好的操作(在数学意义上),但是你也可以使用广播来获得相同的结果。另一方面,标量和矩阵的加法不是一个标准操作,所以你必须进行广播。然而,如果你想要使用广播合并,那么你需要在每个地方使用 .,这是有区别的。 - Bogumił Kamiński

3
这段代码展示了Bogumił Kamiński有用的评论:
julia> m = 1.1
1.1
julia> c = 0.11
0.11
julia> x = rand(1,2)
1×2 Array{Float64,2}:
 0.77683  0.510671

# .+ operator IS used for the addition of the constant.    
julia> y = m*x .+ c
1×2 Array{Float64,2}:
 0.964514  0.671738

# .+ operator is NOT used for the addition of the constant, get Error.    
julia> y = m*x + c
ERROR: MethodError: no method matching +(::Array{Float64,2}, ::Float64)

您想要进行矩阵加标量操作并不孤单,可以参考这里

但是,是否允许这样做取决于您如何定义数学和软件。我编写了数据矩阵软件,在该软件中将标量加到矩阵上是一种标准操作。

然而,该软件的规则与标准线性代数中矩阵的规则非常不同。例如,在该软件使用的数据矩阵代数中,AB = BA,因此矩阵乘法满足交换律,因为矩阵乘法运算符被定义为逐元素相乘。

这完全不同于标准矩阵代数,但却是我所需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接