如何在JULIA中有效构造以下形式的块矩阵?

时间:2019-02-04 12:08:02

标签: matrix julia

因此,我正在编写一个代码,该代码要求我构造一个大型Matrix M 使用大小分别为n x n的较小的“平方”矩阵 J M 进行重复,这样:

This is what the matrix should look like!

ie的尺寸为 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'沿其第二对角线放置?

2 个答案:

答案 0 :(得分:4)

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

一个示例(有Strings个):

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

答案 1 :(得分:0)

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

# 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

不确定效率与其他答案相比如何,但至少可以很高兴地知道它可以完成而不会太复杂。