Hi, 

thanks for the explanation. 

On Wednesday, October 22, 2014 12:15:40 AM UTC+2, Stefan Karpinski wrote:
>
>  
>
>> However, I really needed to assert the type in all involved arrays before 
>> using them in the for-loops, or I would loose a factor 10 or thereabouts in 
>> speed.
>>
>
> This should only be necessary if you're getting these arrays from 
> non-constant globals or from the fields of a composite type that has 
> abstractly typed fields.
>

I don't see immediately how this is the case.  All involved arrays were 
just computed in the lines above the replaced broadcast().  

function stats{T<:FloatingPoint}(gmm::GMM, x::Matrix{T}, order::Int)
... 
    sm2p::Matrix{T} = dot(mp, gmm.μ, 2)      
    xx::Matrix{T} = x .* x                     # nx * d
    pxx::Matrix{T} = broadcast(+, sm2p', xx * prec') # nx * ng
    mpx::Matrix{T} = x * mp'                         # nx * ng
##  γ = broadcast(*, a', exp(mpx .- 0.5pxx)) # nx * ng, 
    γ::Matrix{T} = repmat(a', nx)
    for j = 1:ng
        for i = 1:nx
            @inbounds γ[i,j] *= exp(mpx[i,j] - 0.5pxx[i,j])
        end
    end
...

I replaced the `γ = broadcast()` with the lines below that.  No globals, 
but perhaps the field type gmm.μ is spoiling things.  I am not sure if this 
is a case of an abstractly typed field

type GMM{T<:FloatingPoint}
...
   μ::Array{T}
...
end

Should I have written GMM{T2} in the declaration of stats()?

Cheers, 

---david


Reply via email to