【问题标题】:About behaviour of / by vector in Julia关于 Julia 中 / by 向量的行为
【发布时间】:2018-08-23 12:37:18
【问题描述】:

3/[2;2]给了

1×2 LinearAlgebra.Transpose{Float64,Array{Float64,1}}:
 0.75  0.75

3 ./[2;2] 给了

2-element Array{Float64,1}:
 1.5
 1.5

第二个很容易理解。它广播3 并执行元素明智的划分。但是让第一个操作如此运行的原因是什么?我假设它需要向量的总和,即 2x1,执行 3 除以 4 并将其广播到 1x2 转置向量。我可以接受取向量的总和来进行除法,但为什么要转置呢?或者为什么不只返回一个标量?

【问题讨论】:

    标签: vector julia division broadcast


    【解决方案1】:

    它只是给出右侧操作数的伪逆。

    julia> ?/
    ...  
    Right division operator: multiplication of x by the inverse of y on the right.
    

    虽然乍看之下令人惊讶,但实际上是自然行为。 rowvector*columnvector 给出一个标量,因此一个标量除以一个列向量应该给出一个行向量,就是这种情况。请注意,RowVector 在 1.0 中已被删除,您得到的实际上是用Transpose 表示的行向量。

    您可以写信@less 1 / [2;2] 看看实际发生了什么。

    还可以查看 this GitHub issue 以进一步了解行为,并查看 this discourse topic 以了解某些用例。

    【讨论】:

      【解决方案2】:

      它似乎在计算pseudoinverse of the vector,然后乘以 3。

      使用@which 3/[2;2]等查看实际发生了什么,发现最终是在stdlib/LinearAlgebra/generic.jl中调用如下方法:

      function _vectorpinv(dualfn::Tf, v::AbstractVector{Tv}, tol) where {Tv,Tf}
          res = dualfn(similar(v, typeof(zero(Tv) / (abs2(one(Tv)) + abs2(one(Tv))))))
          den = sum(abs2, v)
          # as tol is the threshold relative to the maximum singular value, for a vector with
          # single singular value σ=√den, σ ≦ tol*σ is equivalent to den=0 ∨ tol≥1
          if iszero(den) || tol >= one(tol)
              fill!(res, zero(eltype(res)))
          else
              res .= dualfn(v) ./ den
          end
          return res
      end
      

      在给定的情况下,它实际上变成了transpose([2;2])/sum(abs2, [2;2]),这是伪逆。

      但是,这有点超出我的想象。所以更有资格的人可能会证明我错了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 2017-03-14
        • 2020-08-01
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多