Julia 形成内部产品的最佳方式是什么?

Julia 形成内部产品的最佳方式是什么?,julia,Julia,我很高兴得知Julia允许一种漂亮简洁的方式来形成内部产品: julia> x = [1;0]; y = [0;1]; julia> x'y 1-element Array{Int64,1}: 0 这个替代点(x,y)的方法很好,但它会带来惊喜: julia> @printf "Inner product = %f\n" x'y Inner product = ERROR: type: non-boolean (Array{Bool,1}) used in boolean

我很高兴得知Julia允许一种漂亮简洁的方式来形成内部产品:

julia> x = [1;0]; y = [0;1];

julia> x'y
1-element Array{Int64,1}:
0
这个替代点(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
,如果是,什么时候这样做是安全的?

这里有一个概念上的问题。当你这样做的时候

julia> x = [1;0]; y = [0;1];
julia> x'y
0
这实际上转化为矩阵*向量积,其维数分别为2x1和1,从而得到1x1矩阵。其他语言,如MATLAB,不区分1x1矩阵和标量,但Julia出于各种原因区分。因此,将其用作“真”内积函数的替代品是永远不安全的,内积函数定义为返回标量输出

现在,如果您不是<代码> DOT/CODES> S的粉丝,您可以考虑<代码>和(x.*y)<代码> >(xy)。还要记住,列向量和行向量是不同的:事实上,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

你需要什么(或不需要什么)以及你愿意牺牲什么还不是很清楚,所以我没有给出答案:你可以使用而不是
dot
。你也可以选择变量/返回函数的类型:
x=[0;1]::数组{Float64,1}
dot([1,2,3],[4,5,6])
现在可以在夜间构建中使用。