Jam*_*der 4 matrix linear-algebra scientific-computing numerical-methods julia
在 Julia 中,我想连接几个数组(也可以将它们相乘)。在我的程序中,我将其编写如下:
\n[U\xe1\xb5\xa3 Q\xe2\x82\x90]*U\xe2\x82\x96\n[V\xe1\xb5\xa3 Q\xe1\xb5\xa6]*V\xe2\x82\x96\nRun Code Online (Sandbox Code Playgroud)\n然而,与我编写的程序的其余部分相比,这个数组串联的开销非常大。除了我所做的(或者只使用 hcat、vcat 函数)之外,Julia 中还有其他方法可以廉价/高效地连接数组吗?
\n问题是,每当您组合矩阵时,所有数据都会被复制。发生这种情况是因为矩阵不能像向量那样增长。
\n但是,如果矩阵足够大,您可以避免通过 复制数据using BlockArrays。组合矩阵的非具体化函数称为mortar。
看看这段代码:
\nusing BlockArrays, BenchmarkTools\na = rand(1000,100)\nb = rand(1000,120)\nz = rand(220,7)\nRun Code Online (Sandbox Code Playgroud)\n现在让我们运行基准测试:
\njulia> @btime [$a $b]*$z;\n 1.234 ms (4 allocations: 1.73 MiB)\n\njulia> @btime mortar(($a, $b)) * $z;\n 573.100 \xce\xbcs (11 allocations: 55.33 KiB)\n\njulia> all([a b]*z .\xe2\x89\x88 mortar((a, b)) * z)\ntrue\nRun Code Online (Sandbox Code Playgroud)\n您可以看到加速比为 2 倍,内存分配差异为 30 倍。然而,结果会根据矩阵的大小和形状而有所不同,因此您应该运行自己的基准测试。
\n