I’m trying to fill a vector A
of length n
with the dot-product of two vectors x
and y
like this
A = fill(sum(x[i]*y[i] for i in eachindex(x)), n)
For three vectors x
, y
, and z
, this can be written as
B = fill(sum(x[i]*y[i]*z[i] for i in eachindex(x)), n)
I want to generalize this for arbitrary number of vectors (two or more) using a function, e.g., without allocating extra temporary vectors. Is it easy to implement this or should I think of another way to do it?
Maybe fillsumprod(x, y...) = fill(sum(prod(z) for z in zip(x,y...)), length(x))
. On my machine, this has performance within 1% of the manual 2-argument version you wrote above.
Thank you very much, this is elegant indeed. But, I observe about 17% and 37% degradation on my machine compared to explicit loops for the two vectors and three vectors, respectively. Actually, this is part of a benchmark for Julia against Python+Numpy in which Julia already beats Numpy by a good margin using the explicit loops as above. I was trying to show my audience how Julia is both fast and elegant at the same time. I wonder if this can be made a bit faster?
Make sure you benchmark using BenchmarkTools with @btime fillsumprod($x,$y)
… I used rand(100)
vectors.
Of course, I use @btime fillsumprod($x, $y);
but my vectors are much bigger, 5e6 elements.