Vector 不同于Julia中转置的单态向量

Vector 不同于Julia中转置的单态向量,vector,julia,matrix-multiplication,Vector,Julia,Matrix Multiplication,如果我定义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

如果我定义
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})
...
...
这似乎是
*
运算符签名的问题,它似乎不接受两个
数组{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

因此,
*
分别为
数组{Int64,1}
数组{Int64,2}
类型的操作数定义。为什么我不能将一个列向量乘以一个单态向量
a
,但我可以使用
a'

这个问题的答案取决于你对线性代数的理解程度。Julia遵循线性代数的惯例,因为它的数组乘法,如果你需要复习的话,是一个很好的源代码

归根结底,您的
A
是一个列向量,而
A'
是一个行向量(如
C
)。矩阵乘法定义在
(n,k)
(k,m)
矩阵之间,以生成
(n,m)
矩阵。列向量有时可以被认为是
(n,1)
矩阵,因此两个列向量之间没有明确定义的乘法概念


如果您想要点积,请使用
dot
功能(您需要先使用linearGebra执行
)。如果您想要元素式产品,可以使用广播符号,
u.*v

在Julia
中,向量
s是一维的
数组
s,而转置作用于二维矩阵(
数组{T,2}
相当于
矩阵{T}

由于Julia中的转置并没有具体化数据,而是保留了对原始数据的引用,因此我需要使用
collect
来实际查看发生了什么

在二维数组上使用乘法时,实际上使用的是线性代数运算

如果要按元素进行乘法,请改用点
运算符:

julia> A .== A'
1×1 BitArray{2}:
 1
注意,它返回一个
数组
,而不是一个值

如果要按元素进行乘法(而不是使用线性代数矩阵乘法),则需要再次矢量化:

julia> B.*A
3-element Array{Int64,1}:
 1
 2
 3

对我来说,很奇怪的是,当一个单例向量同时是一列和一行时,它却被视为一个列向量。我知道这是一种实现选择,但对于语言来说,添加一个列向量(或行向量)乘法的实现,只是为了检查它们是否是单态的,在这种情况下返回结果,否则是一个异常?这是一个实际限制,因为向量(
数组)的类型{T,1}
和矩阵(
Array{T,2}
)是不同的。如果向量的类型是不同的,那么如果它有2个元素而不是1个元素,这对Julia是不好的。如果你想把
a
看作
(1,1)
矩阵,你可以做
重塑(a,1,1)
@PrinceOfBorgo您是否也认为所有空集合都应该被视为相同的?空数值数组是否与空字符串或空字典相同?为什么不一样?
julia> B.*A
3-element Array{Int64,1}:
 1
 2
 3