代码之家  ›  专栏  ›  技术社区  ›  Van Peer

在julia中向数组添加标量

  •  2
  • Van Peer  · 技术社区  · 7 年前

    试图得到一个线性方程 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 回复  |  直到 7 年前
        1
  •  14
  •   norok2    7 年前

    我想这已经变得更严格了。 在里面 Julia 语法(比如 MATLAB ), + * 对全等数组进行运算。

    对于元素操作,应该使用 .+ .* . 奇怪的是,这似乎并不重要 * 但对我来说确实如此 + .

    无论如何,以下两种方法都有效:

    y = m * x .+ c
    

    以及:

    y = m .* x .+ c
    
        2
  •  2
  •   Julia Learner anothershrubery    7 年前

    这段代码说明了Bogumi Kamiski的有用评论:

    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 ,因此对于矩阵乘法是可交换的,因为矩阵乘法运算符被定义为元素对元素的乘法。

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

    推荐文章