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

时间:2015-06-21 15:26:35

标签: julia

我很高兴得知朱莉娅允许以简洁的方式形成内在产品:

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的这种简洁替代方案,如果是,那么何时可以安全使用?

1 个答案:

答案 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