Why is it not allowed to calculate the dot product of two row vectors?
Example:
julia> b=ones(3)'
1×3 RowVector{Float64,Array{Float64,1}}:
1.0 1.0 1.0
julia> a=ones(3)'
1×3 RowVector{Float64,Array{Float64,1}}:
1.0 1.0 1.0
julia> dot(a,b)
ERROR: MethodError: no method matching dot(::RowVector{Float64,Array{Float64,1}}, ::RowVector{Float64,Array{Float64,1}})
julia>
1 Like
In addition to @Mattriks’s solution, a bit more context: think of RowVector
s as matrices to a large extent. See ?RowVector
.
I think the error message could be improved with a statement like “Did you mean vecdot?”
1 Like
I think a dot
method should be added for two RowVector
s. This is pretty unambiguous mathematically: if x
is a vector and x'
is a “row vector” (an element of the dual space), then the inner product on the former should define an inner product on the latter.
https://github.com/JuliaLang/julia/issues/24590
4 Likes
But if we define dot(a,b) = a’*b
one would expect to get back a matrix (the outer product) when a and b are row vectors.
I’d say it should only be defined to return a Number if that’s also the case when a and b are matrices.
I’m skeptical that this should be the definition of dot
; it seems like it should be defined to be an inner product, consistent with norm(x) = sqrt(dot(x,x))
. Note that norm(x')
is already defined to be norm(x)
where x
is a vector.
(I guess your a'b
definition would work too if we defined norm(x)
consistent with sqrt(norm(dot(x,x)))
, but this seems unconventional to me.)
What is the point of defining dot(a,b) = a'b
since you can just type a'b
if that is what you want?
The problem is that the choice of dot product with general matrices is more ambiguous. Worse, we define a default norm(A)
for matrices by the induced norm, but that is not consistent with the most obvious matrix inner product (which would give the Frobenius norm).
3 Likes
dot
should always, always be an inner product and never ever an outer product.
4 Likes