如果我定义 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
如果我定义另一个向量 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})
...
...
这似乎是 *
运算符签名的问题,它似乎在定义另一个向量时不接受两个 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
所以 *
分别定义为 Array{Int64,1}
和 Array{Int64,2}
类型的操作数。为什么我不能将列向量乘以单例向量 A
但可以使用 A'
?
最佳答案
这个问题的答案取决于你对线性代数的理解程度。 Julia 的数组乘法遵循线性代数的约定,如果需要复习,wikipedia's page是一个很好的来源。
归结为您的 A
是列向量,而 A'
是行向量(如 C
)。 (n, k)
和 (k, m)
矩阵之间定义矩阵乘法以产生 (n, m)
矩阵。列向量有时可以被认为是 (n, 1)
矩阵,因此没有明确定义的两个列向量之间的乘法概念。
如果您想要点积,请使用 dot
函数(您需要先执行 using LinearAlgebra
)。如果你想要一个基于元素的产品,你可以使用广播符号 u .* v
。
关于vector - 与 Julia 中的转置不同的单例向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61085910/