2015-01-26 1 views
2

Я ищу реализацию на месте элементарного умножения матрицы в Julia, а также продукт Schur, известный как продукт Hadamard.На месте поэтапное умножение матрицы aka Schur Product aka Hadamard Product?

Это может быть выполнено с помощью распределений по A. * B, но я не могу выделить дополнительную память каждый раз, когда выполняю эту операцию.

Конечно, я мог бы реализовать его сам, но я бы предпочел стандартную реализацию, если он существует.

Благодаря

+0

Вы можете начать с '> @which А. * b' ' * (As :: AbstractArray {T, N} ...) в broadcast.jl:. 278' – ptb

ответ

6

Я не знаю на в месте поэлементно умножения матриц, и я имел хороший взгляд в 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 
+3

Другой вариант заключается в использовании 'broadcast!' - даже если вам не нужны средства вещания, он работает отлично. 'broadcast! (*, A, A, B)' –

+0

Да, очень верно! Я просто написал тест, и моя версия не более чем на 10% быстрее, чем 'broadcast!' – IainDunning