如果定义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
。