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