如何在Julia中向量化实现同尺寸Matrix{Vector}的外和广播?
原生Julia实现矩阵对应位置向量的外和生成Matrix{Matrix{}}
问题描述
现有两个尺寸相同的Matrix{Vector{}}类型矩阵A和B,需生成Matrix{Matrix{}}类型矩阵M,满足M[i, j][k, l] = A[i, j][k] + B[i, j][l],即每个元素为A和B对应位置向量的外和。
示例情况
A=[[[1, 2]] [[3, 4]] ; [[5, 6]] [[7, 8]]] # 输出: # 2×2 Matrix{Vector{Int64}}: # [1, 2] [3, 4] # [5, 6] [7, 8]
B=[[[11, 21]] [[13, 44]] ; [[25, 61]] [[27, 28]]] # 输出: # 2×2 Matrix{Vector{Int64}}: # [11, 21] [13, 44] # [25, 61] [27, 28]
size(A)==size(B) # 输出:true
目标结果示例:
M=[A[i, j] .+ B[i, j]' for i in 1:size(A)[1], j in 1:size(A)[2]] # 输出: # 2×2 Matrix{Matrix{Int64}}: # [12 22; 13 23] [16 47; 17 48] # [30 66; 31 67] [34 35; 35 36]
尝试过的方法及问题
由于A和B是大规模矩阵,希望避免循环实现向量化操作,但尝试A .+ adjoint.(B)时出现维度不匹配错误:
ERROR: DimensionMismatch: dimensions must match: a has dims (Base.OneTo(1), Base.OneTo(2)), b has dims (Base.OneTo(2),), mismatch at 1
现有解决方案(TensorCast包)
已通过TensorCast包实现需求:
using TensorCast @cast MCast[i, j][k, l] := A[i, j][k] + B[i, j][l]; MCast = collect(MCast); # 输出: # 2×2 Matrix{SubArray{Int64, 2, Array{Int64, 4}, Tuple{Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}, Int64, Int64}, true}}: # [12 22; 13 23] [16 47; 17 48] # [30 66; 31 67] [34 35; 35 36]
需求
寻求更优雅的原生Julia实现方案。
内容的提问来源于stack exchange,提问作者Anjishnu Bose
相关产品推荐
相关产品推荐

