Vector operations: any preference for using AbstractVector or n-by-1 array

Consider the multiplication of a n-by-n matrix M and a n-dimensional vector v, M*v. One may write v either

  • as an n-element Array (typeof(v) <: AbstractVector is true),
  • or write it as an n×1 array (typeof(v) <: AbstractVector is false).

Glancing through the source code matmul.jl, it looks like one uses gemv! and the other uses gemm_wrapper!; as for timing, there seems to be very small differences

m=rand(10000,10000);
v=rand(10000);
v2=rand(10000,1);


@btime $m*$v;
  34.902 ms (2 allocations: 78.20 KiB)

@btime $m*$v2;
  36.459 ms (2 allocations: 78.20 KiB)

Also, to make an n-by-n matrix from v*v', @which shows Vector uses adjtrans.jl while n-by-1 array uses matmul.jl. Looks like AbstractVector can be slightly faster for high dimension cases, and for things like v'*m*v, typeof(v) <: AbstractVector gives a number whereas n-by-1 matrix v gives a 1-by-1 matrix.
Generally, what’s the pros/cons of using one as opposed to the other, and is there any preferences for using either one?

Thanks!

In my opinion, you are taking too fine-grained a perspective. Keep it simple.
typeof(zeros(Int, 3)) == Array{Int64,1}, so do what Julia does: use an n-element Array. That way, whatever you do likely works with other sorts of AbstractVector – which is very helpful.

1 Like

This is very related to a very (in)famous Julia issue:
https://github.com/JuliaLang/julia/issues/4774
(Warning: it’s also one of the longest Julia issues…)

1 Like

To summarize: Use a 1-dimensional Vector if you mean a vector.

3 Likes

Thanks!