【发布时间】:2019-08-27 16:29:27
【问题描述】:
我正在尝试将 Julia 中的 N 维 (N>=3) 数组作为矩阵批次相乘,即沿最后两个维度执行矩阵乘法,同时保持其他维度不变。
例如,如果x 的维度为(d1,d2,4,3),y 的维度为(d1,d2,3,2),则乘法的结果应该为(d1,d2,4,2),即应该执行一批矩阵乘法。
这正是 Python 的 numpy.matmul 中发生的情况:
如果任一参数为 N-D,N > 2,则将其视为驻留在最后两个索引中的矩阵堆栈并相应地广播。
np.matmul(randn(10,10,4,3), randn(10,10,3,2)).shape
(10, 10, 4, 2)
有没有办法在 Julia 中重现 numpy.matmul 的行为?
我希望.* 可以工作,但是:
julia> randn(10,10,4,3) .* randn(10,10,3,2)
ERROR: DimensionMismatch("arrays could not be broadcast to a common size")
Stacktrace:
[1] _bcs1 at ./broadcast.jl:485 [inlined]
[2] _bcs at ./broadcast.jl:479 [inlined] (repeats 3 times)
[3] broadcast_shape at ./broadcast.jl:473 [inlined]
[4] combine_axes at ./broadcast.jl:468 [inlined]
[5] instantiate at ./broadcast.jl:256 [inlined]
[6] materialize(::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{4},Nothing,typeof(*),Tuple{Array{Float64,4},Array{Float64,4}}}) at ./broadcast.jl:798
[7] top-level scope at REPL[80]:1
我知道列表推导可能适用于 3-D,但在更高维度上会变得非常混乱。重塑(或查看)除最后两个维度之外的所有维度、使用列表理解并将其重新整形的最佳解决方案是什么?还是有更好的办法?
附:我能找到的最接近的东西是this,但并不完全相同。对 Julia 来说是新手,因此可能会遗漏一些对 Julia 用户来说显而易见的东西。
【问题讨论】:
标签: numpy julia matrix-multiplication