【问题标题】:What is the best way to form inner products?形成内积的最佳方法是什么?
【发布时间】: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 矩阵相关的陷阱。

但我是 Julia 的新手,可能我的想法不正确。其他人是否使用dot 的这种简洁替代方法,如果使用,何时可以安全使用?

【问题讨论】:

  • 不清楚您需要(或不需要)什么以及您愿意牺牲什么,所以我没有发布答案:您可以使用 operator 而不是@987654329 @。您还可以declare 期望变量/返回函数的类型:x=[0;1]::Array{Float64,1}

标签: julia


【解决方案1】:

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

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

这实际上变成了一个矩阵*向量乘积,维度分别为2x1和1,得到一个1x1矩阵。其他语言(例如 MATLAB)不区分 1x1 矩阵和标量,但 Julia 出于各种原因会这样做。因此,将它用作“真正的”内积函数dot 的替代方案是绝对不安全的,后者被定义为返回标量输出。

现在,如果您不是dots 的粉丝,可以考虑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

【讨论】:

  • dot( [1,2,3], [4,5,6] ) 现在适用于夜间构建。
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2010-09-17
  • 2015-03-08
相关资源
最近更新 更多