【问题标题】:In-place elementwise matrix multiplication aka Schur Product aka Hadamard Product?就地元素矩阵乘法又名舒尔产品又名哈达玛产品?
【发布时间】:2015-01-26 22:42:11
【问题描述】:

我正在寻找 Julia 中元素矩阵乘法的就地实现,也就是 Schur 乘积,也就是 Hadamard 乘积。

它可以通过 A .* B 分配来执行,但是我不能每次执行此操作时都分配额外的内存。

当然我可以自己实现它,但如果有标准实现,我更喜欢它。

谢谢

【问题讨论】:

  • 你可以从>@which A.*B.*(As::AbstractArray{T,N}...) at broadcast.jl:278开始

标签: linear-algebra julia


【解决方案1】:

我不知道就地元素矩阵乘法,我在julia/base/*.jl 中看得很清楚,但找不到。我们有就地矩阵乘法(例如A_mul_B!),但这更重要,因为我们可以为此使用 BLAS。逐元素矩阵乘法不使用 BLAS、AFAIK,所以不妨使用您自己的:

function had!{T<:Number}(A::Matrix{T},B::Matrix{T})
    m,n = size(A)
    @assert (m,n) == size(B)
    for j in 1:n
       for i in 1:m
         @inbounds A[i,j] *= B[i,j]
       end
    end
    return A
end

例如

julia> A = rand(2,2)
2x2 Array{Float64,2}:
 0.881304  0.916678
 0.590368  0.630032

julia> B = [2.0 3.0; 4.0 5.0]
2x2 Array{Float64,2}:
 2.0  3.0
 4.0  5.0

julia> had!(A,B);

julia> A
2x2 Array{Float64,2}:
 1.76261  2.75003
 2.36147  3.15016

【讨论】:

  • 另一种选择是使用broadcast! - 即使您不需要广播设施,它也可以正常工作。 broadcast!(*,A,A,B)
  • 是的,非常真实!我刚刚写了一个benchmark,我的版本比broadcast!快不超过10%
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 2022-01-12
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
相关资源
最近更新 更多