Here's a way to do it with slices

julia> function f(mat)
           mat1 = slice(mat, 1, :)
           mat2 = slice(mat, 2, :)
           mat3 = slice(mat, 3, :)
           A = Array(Float64, size(mat, 2))
           for i in 1:size(mat, 2)
               A[i] = sqrt(mat1[i]^2 + mat2[i]^2 + mat3[i]^2)
           end
           A
       end
f (generic function with 2 methods)

julia> f(mat);

julia> @time f(mat);
  0.008991 seconds (15 allocations: 7.630 MB)


On Wednesday, August 12, 2015 at 11:09:06 AM UTC-4, jw3126 wrote:
>
> I have a matrix and I want to compute the norm of each column. I tried 
>
> using TimeIt
> N = 10^6
> mat = randn(3, N)
>
> @timeit mapslices(norm, mat, 1)
>
> 1 loops, best of 3: 
>
> 915.13 ms per loop
>
>
> Dog slow, 100times slower then numpy:
>
> import numpy as np
> N = 10**6
> mat = np.random.randn(3, N)
> %timeit np.linalg.norm(mat, axis=0)
>
>
> 100 loops, best of 3: 
> 9.71 ms per loop
>  
>
> If I understand it correctly, the reason is that mapslices can not really 
> optimize on the norm argument, e.g. inline norm. I had two ideas how to 
> solve this problem, both of which are problematic:
>
> 1) There is the NumericExtensions 
> <https://github.com/lindahua/NumericExtensions.jl> package, which seems 
> to be aimed at this kind of problem, however this package is deprecated, so 
> I don't want to use it.
>
> 2) Write some code by hand. This gives speedup, but is still  slower then 
> numpy:
>
> N = 10^6
> mat = randn(3, N)
> function f(mat)
>     return sqrt(mat[1,:].^2 + mat[2,:].^2 + mat[3,:].^2)
> end
>
> @timeit f(mat)
>
> 10 loops, best of 3: 
>
> 38.51 ms per loop
>
>
> So how to make this computation fast? And more generally what are ways 
> speed up mapslices without using NumericExtensions?
>

Reply via email to