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? >