将标量添加到julia中的数组

时间:2018-09-14 15:15:53

标签: arrays julia scalar

试图获得线性方程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 个答案:

答案 0 :(得分:5)

我想这已经变得更加严格了。 在Julia语法中(例如在MATLAB中),+*对全等数组进行操作。

对于逐元素操作,应使用.+.*。 奇怪的是,这对*似乎无关紧要,但对+却无关紧要。

无论如何,以下两项均有效:

y = m * x .+ c

和:

y = m .* x .+ c

答案 1 :(得分:1)

此代码说明了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)

并非只有一个人想要做矩阵+标量运算,请参见here

但是,是否允许它取决于您如何定义数学以及如何定义软件。我已经编写了数据矩阵软件,其中将标量添加到矩阵是标准操作。

但是,该软件的规则与标准线性代数中的矩阵规则完全不同。例如,在该软件使用的数据矩阵代数AB = BA中,由于矩阵乘法算子被定义为逐元素乘法,因此可以对矩阵乘法进行交换。

那与标准矩阵代数完全不同,但这正是我想要的。