将矩阵的列与 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, :]
都是 Vector
s -- 等级 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
让
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, :]
都是 Vector
s -- 等级 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