将矩阵的列与 Julia 中的另一个矩阵的行相乘

Multiply column of a matrix with row of another matrix in Julia

A = rand(3,3);B = rand(3,3)

我可以将 A : A[:,1] 的第一列与矩阵的第三行 B : B[3,:] 相乘 通过命令:

reshape(A[:,1],3,1)*reshape(B[3,:],1,3)

制作一个 3x3 矩阵。

直接计算

A[:,1]*B[3,:]

给出错误:

ERROR: MethodError: no method matching *(::Vector{Float64}, ::Vector{Float64})
Closest candidates are:
  *(::Any, ::Any, ::Any, ::Any...) at operators.jl:560
  *(::StridedMatrix{T}, ::StridedVector{S}) where {T<:Union{Float32, Float64, ComplexF32, ComplexF64}, S<:Real} at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\matmul.jl:44
  *(::StridedVecOrMat{T} where T, ::LinearAlgebra.Adjoint{var"#s832", var"#s831"} where {var"#s832", var"#s831"<:LinearAlgebra.LQPackedQ}) at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\lq.jl:254
  ...
Stacktrace:
 [1] top-level scope
   @ REPL[2]:1

还有其他short/clear方法可以做这个操作吗?

答案:A[:, 1:1] * B[3:3, :]A[:, 1] * B[3, :]' 来自@phipsgabler 的回复。或者 view(A, :, 1)*view(B, 3, :)' , @views A[:, 1] * B[3, :]' 不复制行或列。

A[:, 1]B[3, :] 都是 Vectors -- 等级 1 -- 所以它不会自动清除你在这里想要什么。更可能的选择是内积:

julia> dot(A[:, 1], B[3, :])
0.8875027511646011

julia> A[:, 1]' * B[3, :]
0.8875027511646011

但你似乎想要外积:

julia> reshape(A[:,1],3,1)*reshape(B[3,:],1,3)
3×3 Matrix{Float64}:
 0.689437  0.246968   0.190616
 0.400674  0.143528   0.110778
 0.197257  0.0706608  0.0545377

julia> A[:, 1:1] * B[3:3, :]
3×3 Matrix{Float64}:
 0.689437  0.246968   0.190616
 0.400674  0.143528   0.110778
 0.197257  0.0706608  0.0545377

julia> A[:, 1] * B[3, :]'
3×3 Matrix{Float64}:
 0.689437  0.246968   0.190616
 0.400674  0.143528   0.110778
 0.197257  0.0706608  0.0545377

解释一下:通过使用范围 1:1 而不是索引,结果仍将是一个矩阵(就像您的 reshape 方法一样):

julia> B[3:3, :]
1×3 Matrix{Float64}:
 0.938292  0.336112  0.259419

这样 * 被明确定义为 one-column 矩阵和 one-row 矩阵之间的矩阵乘积。

如果转置其中一个向量,同样适用:

julia> B[3, :]'
1×3 adjoint(::Vector{Float64}) with eltype Float64:
 0.938292  0.336112  0.259419

一个向量和一个协向量的乘积也是well-defined。

最后一个选项是使用kron;然而,这会将结果矢量化,您必须重塑输出:

julia> reshape(kron(A[:, 1], B[3, :]), 3, 3)
3×3 Matrix{Float64}:
 0.689437  0.400674  0.197257
 0.246968  0.143528  0.0706608
 0.190616  0.110778  0.0545377