Matrix 如何在JULIA中有效地构造以下形式的块矩阵?
因此,我正在编写一个代码,要求我构造一个大矩阵M 使用尺寸分别为n x n的较小“方形”矩阵J和M,重复如下操作: i、 e的尺寸为M,使得M沿对角线重复“L”次,J'沿上第二对角线重复,J沿下第二对角线重复 请注意,我正在研究Julia v 1.0.0,据我所知,与Mathematica不同,Julia中没有直接指定块矩阵的方法 我尝试使用Kronecker产品来解决我的问题:Matrix 如何在JULIA中有效地构造以下形式的块矩阵?,matrix,julia,Matrix,Julia,因此,我正在编写一个代码,要求我构造一个大矩阵M 使用尺寸分别为n x n的较小“方形”矩阵J和M,重复如下操作: i、 e的尺寸为M,使得M沿对角线重复“L”次,J'沿上第二对角线重复,J沿下第二对角线重复 请注意,我正在研究Julia v 1.0.0,据我所知,与Mathematica不同,Julia中没有直接指定块矩阵的方法 我尝试使用Kronecker产品来解决我的问题: BlockArrays.jl (and maybe BlockBandedMatrices.jl) should
BlockArrays.jl (and maybe BlockBandedMatrices.jl) should be what you are looking for as it makes handling block matrix structures very convenient.
An example (with Strings
s):
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"
(也许)应该是您想要的,因为它使处理块矩阵结构非常方便
示例(带字符串
s):
有关更多信息,请查看软件包的。您也可以在不使用任何外部软件包的情况下执行此操作,例如:
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
最终矩阵bM
为:
不确定与其他答案相比效率如何,但至少知道它可以在不太复杂的情况下完成可能会很好。如果您只需要矩阵,您也可以使用文字语法:[M J;J M]
我想要构造的矩阵实际上是一个非常大的矩阵,因此文字语法是不可能的。然而,正如user@crstnbr所说,我可能能够使用BlockArrays包构造一个函数来定义这样一个矩阵。谢谢
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