我很高兴得知朱莉娅允许以简洁的方式形成内在产品:
julia> x = [1;0]; y = [0;1];
julia> x'y
1-element Array{Int64,1}:
0
dot(x,y)
的替代方案很不错,但它可能导致意外:
julia> @printf "Inner product = %f\n" x'y
Inner product = ERROR: type: non-boolean (Array{Bool,1}) used in boolean context
julia> @printf "Inner product = %f\n" dot(x,y)
Inner product = 0.000000
因此,虽然我想写x'y
,但似乎最好避免使用它,否则我需要意识到与标量和1对1矩阵相关的陷阱。
但我是朱莉娅的新手,可能我没有以正确的方式思考。其他人是否使用dot
的这种简洁替代方案,如果是,那么何时可以安全使用?
答案 0 :(得分:6)
这里有一个概念问题。当你这样做
julia> x = [1;0]; y = [0;1];
julia> x'y
0
实际上它变成了矩阵*矢量积,其尺寸分别为2x1和1,产生1x1矩阵。其他语言,如MATLAB,不区分1x1矩阵和标量,但Julia的原因有多种。因此,使用它作为“真正的”内积函数dot
的替代是永远不可能的,它被定义为返回标量输出。
现在,如果您不是dot
的粉丝,可以考虑sum(x.*y)
sum(x'y)
。还要记住,列和行向量是不同的:事实上,Julia中没有行向量,更多的是有1xN矩阵。所以你得到像
julia> x = [ 1 2 3 ]
1x3 Array{Int64,2}:
1 2 3
julia> y = [ 3 2 1]
1x3 Array{Int64,2}:
3 2 1
julia> dot(x,y)
ERROR: `dot` has no method matching dot(::Array{Int64,2}, ::Array{Int64,2})
You might have used a 2d row vector where a 1d column vector was required.
Note the difference between 1d column vector [1,2,3] and 2d row vector [1 2 3].
You can convert to a column vector with the vec() function.
错误消息建议为dot(vec(x),vec(y)
,但sum(x.*y)
在这种情况下也适用,并且更短。
julia> sum(x.*y)
10
julia> dot(vec(x),vec(y))
10