单例向量不同于它在 Julia 中的转置

Pri*_*rgo 3 vector matrix-multiplication julia

如果我定义A = [1]我得到它A不等于,A'因为它们是不同的类型:

julia> A=[1]
1-element Array{Int64,1}:
 1

julia> A'
1×1 LinearAlgebra.Adjoint{Int64,Array{Int64,1}}:
 1

julia> A == A'
false
Run Code Online (Sandbox Code Playgroud)

如果我定义另一个向量B = [1, 2, 3]并尝试使用乘积来计算A'A我会得到以下输出:

B=[1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> B*A'
3×1 Array{Int64,2}:
 1
 2
 3

julia> B*A
ERROR: MethodError: no method matching *(::Array{Int64,1}, ::Array{Int64,1})
...
...
Run Code Online (Sandbox Code Playgroud)

这似乎是*运算符签名的问题,Array{Int64,1}在定义C = [4 5]我们得到的另一个向量时,似乎不接受两个作为操作数:

julia> C=[4 5]
1×2 Array{Int64,2}:
 4  5

julia> B*C
3×2 Array{Int64,2}:
  4   5
  8  10
 12  15
Run Code Online (Sandbox Code Playgroud)

So分别*为类型Array{Int64,1}和操作数定义Array{Int64,2}。为什么我不能将列向量乘以单例向量,A但我可以使用A'

Mas*_*son 5

答案取决于您对线性代数的理解程度。Julia 的数组乘法遵循线性代数的约定,如果您需要复习维基百科的页面是一个很好的来源。

它归结为一个事实,即您A是一个列向量,A'而是一个行向量(如C)。矩阵乘法在(n, k)(k, m)矩阵之间定义以产生(n, m)矩阵。有时可以将列向量视为(n, 1)矩阵,因此没有明确定义的两个列向量之间的乘法概念。

如果您想要点积,请使用该dot功能(您需要先做using LinearAlgebra)。如果您想要元素明智的产品,则可以使用广播符号u .* v.

  • 这是一个实际限制,因为向量 (`Array{T, 1}` 和矩阵 (`Array{T, 2}`) 的类型不同。如果 a 的类型如果向量有 2 个元素而不是 1 个元素,则向量会有所不同。如果要将“A”视为“(1,1)”矩阵,可以执行“reshape(A, 1, 1)”。 (2认同)