就地元素矩阵乘法又名 Schur Product 又名 Hadamard Product?
In-place elementwise matrix multiplication aka Schur Product aka Hadamard Product?
我正在寻找 Julia 中元素矩阵乘法的就地实现,又名 Schur 乘积又名 Hadamard 乘积。
可以通过A.*B的分配来执行,但是我不能每次执行这个操作都分配额外的内存。
当然我可以自己实现,但如果存在标准实现,我更喜欢它。
谢谢
我不知道就地元素矩阵乘法,我仔细查看了 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
我正在寻找 Julia 中元素矩阵乘法的就地实现,又名 Schur 乘积又名 Hadamard 乘积。
可以通过A.*B的分配来执行,但是我不能每次执行这个操作都分配额外的内存。
当然我可以自己实现,但如果存在标准实现,我更喜欢它。
谢谢
我不知道就地元素矩阵乘法,我仔细查看了 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