因此,我正在编写一个代码,该代码要求我构造一个大型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'沿其第二对角线放置?
答案 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
不确定效率与其他答案相比如何,但至少可以很高兴地知道它可以完成而不会太复杂。