在 Julia 中,我想连接多个数组(也可以将它们相乘)。在我的程序中,我将其编写如下:
[Uᵣ Qₐ]*Uₖ
[Vᵣ Qᵦ]*Vₖ
但是,与我编写的程序的其余部分相比,这个数组串联“非常昂贵”。除了我所做的(或仅使用 hcat、vcat 函数)之外,Julia 中还有什么方法可以廉价/高效地连接数组?
但是,如果矩阵足够大,您可以避免通过
using BlockArrays
复制数据。组合矩阵的非具体化函数称为
mortar
。看一下这段代码:
using BlockArrays, BenchmarkTools
a = rand(1000,100)
b = rand(1000,120)
z = rand(220,7)
现在让我们运行基准测试:
julia> @btime [$a $b]*$z;
1.234 ms (4 allocations: 1.73 MiB)
julia> @btime mortar(($a, $b)) * $z;
573.100 μs (11 allocations: 55.33 KiB)
julia> all([a b]*z .≈ mortar((a, b)) * z)
true
您可以看到加速比为 2 倍,内存分配差异为 30 倍。然而,结果会根据矩阵的大小和形状而有所不同,因此您应该运行自己的基准测试。