在Julia中高效/廉价连接数组的方法?

4
在Julia中,我想要将几个数组连接在一起(也可以对它们进行乘法操作)。在我的程序中,我已经按照如下方式编写了代码:
[Uᵣ Qₐ]*Uₖ
[Vᵣ Qᵦ]*Vₖ

然而,与我编写的程序的其余部分相比,这种数组连接非常昂贵。在Julia中,除了使用hcat、vcat函数之外,是否有其他廉价/有效地连接数组的方法?
1个回答

6
问题在于,每当您组合矩阵时,所有数据都会被复制。这是因为矩阵不能像向量那样增长。
然而,如果您的矩阵足够大,可以通过使用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倍。但是,结果会根据矩阵的大小和形状而有所不同,所以你应该运行自己的基准测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接