【问题标题】:How do I efficiently construct a block matrix of the following form in JULIA?如何在 JULIA 中有效地构造以下形式的块矩阵?
【发布时间】:2021-12-07 20:58:49
【问题描述】:

所以我正在编写一个代码,该代码需要我构建一个大型矩阵 M 使用较小的“方形”矩阵 JM,每个大小为 n x n,重复如下:

即具有 M 的尺寸,使得 M 沿对角线重复“L”次,J' 沿上部重复第二对角线和 J 在第二对角线下方。

请注意,我正在开发 Julia v 1.0.0,据我了解,与 Mathematica 不同,在 Julia 中没有直接分配块矩阵的方法。

我尝试使用 Kronecker 产品来解决我的问题:

 ????=Diagonal(ones(L)) #IDENTITY matrix of L x L size
 ????=kron(????,M)

这样做,我可以制作一个块对角矩阵 M,小矩阵 M 沿其对角线重复。但是现在如何根据需要将矩阵 J 和 J' 沿其第二条对角线放置?

【问题讨论】:

    标签: matrix julia


    【解决方案1】:

    BlockArrays.jl(也许是BlockBandedMatrices.jl)应该是您正在寻找的,因为它使处理块矩阵结构非常方便。

    一个例子(Stringss):

    julia> using BlockArrays
    
    julia> M = fill("M", 2,2);
    
    julia> J = fill("J", 2,2);
    
    julia> B = BlockArray{String}(undef_blocks, [2,2], [2,2])
    4×4 BlockArray{String,2,Array{String,2}}:
     #undef  #undef  │  #undef  #undef
     #undef  #undef  │  #undef  #undef
     ────────────────┼────────────────
     #undef  #undef  │  #undef  #undef
     #undef  #undef  │  #undef  #undef
    
    julia> setblock!(B, M, 1,1);
    
    julia> setblock!(B, M, 2,2);
    
    julia> setblock!(B, J, 1,2);
    
    julia> setblock!(B, J, 2,1);
    
    julia> B
    4×4 BlockArray{String,2,Array{String,2}}:
     "M"  "M"  │  "J"  "J"
     "M"  "M"  │  "J"  "J"
     ──────────┼──────────
     "J"  "J"  │  "M"  "M"
     "J"  "J"  │  "M"  "M"
    

    有关更多信息,请查看包的documentation

    【讨论】:

    • 如果你只想要矩阵,你也可以使用文字语法:[M J; J M]
    • 我要构造的矩阵实际上是一个很大的矩阵,所以无法进行字面语法。然而,就像用户@crstnbr 所说,我也许可以使用 BlockArrays 包来构造一个函数来定义这样的矩阵。谢谢!
    【解决方案2】:

    您也可以在没有任何外部软件包的情况下执行此操作:

    # assign stand-in values
    L = 4;
    n = 2;
    M = reshape(1:n^2, (n, n));
    J = -M;
    
    # put together the larger matrix
    μ = [zeros(Int64, n, n) for i in 1:L, j in 1:L];
    μ[diagind(μ)] .= [M];
    μ[diagind(μ, -1)] .= [J];
    μ[diagind(μ, 1)] .= [J'];
    bM = reduce(vcat, [reduce(hcat, μ[i, :]) for i in 1:L]);
    

    那么最后的矩阵bM就是:

    8×8 Array{Int64,2}:
      1   3  -1  -2   0   0   0   0
      2   4  -3  -4   0   0   0   0
     -1  -3   1   3  -1  -2   0   0
     -2  -4   2   4  -3  -4   0   0
      0   0  -1  -3   1   3  -1  -2
      0   0  -2  -4   2   4  -3  -4
      0   0   0   0  -1  -3   1   3
      0   0   0   0  -2  -4   2   4
    

    不确定效率与其他答案相比如何,但至少知道它可以在没有太多复杂性的情况下完成。

    【讨论】:

      【解决方案3】:

      Linear Algebra 包中的 Tridiagonal 函数提供了所需的结果。

      示例

      dl = ones(5)
      du = ones(5) * 2
      d = ones(5 + 1) * 3
      
      Tridiagonal(dl, d, du)
      

      结果

      6×6 Tridiagonal{Float64, Vector{Float64}}:
       3.0  2.0   ⋅    ⋅    ⋅    ⋅ 
       1.0  3.0  2.0   ⋅    ⋅    ⋅ 
        ⋅   1.0  3.0  2.0   ⋅    ⋅ 
        ⋅    ⋅   1.0  3.0  2.0   ⋅ 
        ⋅    ⋅    ⋅   1.0  3.0  2.0
        ⋅    ⋅    ⋅    ⋅   1.0  3.0
      

      如果您正在寻找对称三对角矩阵,您可以使用同一包中的SymTridiagonal

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多