将标量添加到 julia 中的数组
adding scalar to an array in julia
正在尝试获得线性方程 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
而不是加法时,这有什么区别?
我想这变得更严格了。
在 Julia
语法中(如 MATLAB
),+
和 *
对全等数组进行运算。
对于逐元素操作,你应该使用.+
和.*
。
奇怪的是,这对 *
似乎无关紧要,但对 +
.
却很重要
无论如何,以下两个都有效:
y = m * x .+ c
和:
y = m .* x .+ c
此代码说明了 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
因此矩阵乘法可交换,因为矩阵乘法运算符被定义为逐元素乘法。
这与标准矩阵代数完全不同,但正是我想要的。
正在尝试获得线性方程 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
而不是加法时,这有什么区别?
我想这变得更严格了。
在 Julia
语法中(如 MATLAB
),+
和 *
对全等数组进行运算。
对于逐元素操作,你应该使用.+
和.*
。
奇怪的是,这对 *
似乎无关紧要,但对 +
.
无论如何,以下两个都有效:
y = m * x .+ c
和:
y = m .* x .+ c
此代码说明了 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
因此矩阵乘法可交换,因为矩阵乘法运算符被定义为逐元素乘法。
这与标准矩阵代数完全不同,但正是我想要的。