gpt4 book ai didi

julia - 将单位 block 分配到更大的矩阵中

转载 作者:行者123 更新时间:2023-12-02 18:55:31 24 4
gpt4 key购买 nike

在matlab中,假设我想构建一个包含单位 block 的矩阵A,我可以使用

A = zeros(4,4);
A(1:2,1:2) = eye(2);

在 Julia 中,我知道 UniformScaling/I 运算符。然而,我似乎不能以同样的方式使用,我读到的所有内容都说它取代了 eye 运算符。

朱利安式的方法是什么?

编辑:我目前正在使用一些Diagonal(ones(...))来实际创建对角线 block 。

关于第一个答案,它似乎与 Matrix(I...) 语法相对可比(速度慢两倍),但在大型矩阵的内存使用方面要好得多(大约减少一百倍)。

请参阅此代码以进行测试

using LinearAlgebra
using BenchmarkTools


A = zeros(10,10)
@btime A[1:8,1:8] = Matrix(I,8,8)

B = zeros(10,10)
@btime B[1:8,1:8] = Diagonal(ones(8))

A == B

A = zeros(100,100)
@btime A[1:80,1:80] = Matrix(I,80,80)

B = zeros(100,100)
@btime B[1:80,1:80] = Diagonal(ones(80))

A == B

A = zeros(1000,1000)
@btime A[1:800,1:800] = Matrix(I,800,800)

B = zeros(1000,1000)
@btime B[1:800,1:800] = Diagonal(ones(800))

A == B

返回

  155.858 ns (1 allocation: 160 bytes)
176.879 ns (2 allocations: 160 bytes)
6.680 μs (1 allocation: 6.44 KiB)
10.799 μs (2 allocations: 752 bytes)
617.099 μs (2 allocations: 625.14 KiB)
1.007 ms (2 allocations: 6.39 KiB)
true

最佳答案

这是一种几乎不分配的通用方法:

julia> using LinearAlgebra, BenchmarkTools

julia> function func1(z, a, b)
z[diagind(z)[a:b]] .= one(eltype(z))
return z end
func1 (generic function with 1 method)

julia> test = zeros(1_000, 1_000);

julia> @btime func1($test, 1, 2);
68.680 ns (2 allocations: 80 bytes)

julia> @btime func1($test, 1, 500);
441.919 ns (2 allocations: 80 bytes)

julia> @btime func1($test, 1, 1000);
2.444 μs (2 allocations: 80 bytes)

编辑添加:与许多其他语言相比,Julia 中最简单、最有效的解决方案通常是循环:

julia> function func2(z, a, b)
for i ∈ a:b
z[i, i] = one(eltype(z))
end
return z
end
func2 (generic function with 1 method)
julia> @btime func2($test, 1, 2);
2.000 ns (0 allocations: 0 bytes)

julia> @btime func2($test, 1, 500);
265.337 ns (0 allocations: 0 bytes)

julia> @btime func2($test, 1, 1000);
2.200 μs (0 allocations: 0 bytes)

关于julia - 将单位 block 分配到更大的矩阵中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66209005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com