我正在使用Julia版本1.1。 我正在处理可以从较小的矩阵(例如Pauli矩阵)构建的矩阵。我尚不清楚如何通过在Julia中使用一组较小的矩阵来有效地构造大型矩阵,即直接将较小的矩阵写入某个索引位置。
Julias kron
并不令人满意,因为我需要生成多个“大矩阵”才能获得最终结果。例如。我想创建这样的东西(这只是一个很小的例子)
sy = [[0 -im]; [im 0]]
M = [[0 sy adjoint(sy)];
[adjoint(sy) 0 sy];
[sy adjoint(sy) 0]]
可以通过将两个kronecker产品相加两个结果来实现。但是,这将是巨大的浪费,尤其是如果矩阵变大。
我也已经尝试使用软件包BlockArrays.jl
,但意识到它不能满足我的需求。
最后,我希望能够处理我的大矩阵的“矩阵块”,以便我可以直接将构造矩阵分配给正确的位置,对于上面的示例,这看起来像以下内容(我没有使用循环以使我的观点更清楚):
M[1, 2] = sy
M[1, 3] = adjoint(sy)
M[2, 1] = adjoint(sy)
M[2, 3] = sy
M[3, 1] = sy
M[3, 2] = adjoint(sy)
我意识到这意味着将我原来的大数组索引减少为数组“块索引”之类的东西。
我考虑过使用视图进行此操作,在其中创建一个SubArrays
矩阵,然后可以使用矩阵块索引符号进行寻址,例如
S0 = view(M, 1:2, 1:2)
S1 = view(M, 1:2, 2:4)
S2 = view(M, 1:2, 4:6)
...
Viewmatrix = [[S0 S1 S2]; [S3 S4 S5]; [S6 S7 S8]]
Viewmatrix[1, 2] .= sy
Viewmatrix[1, 3] .= adjoint(sy)
...
现在我不清楚人们实际上将如何处理并编写这样的视图矩阵,或者这是否是解决问题的可行方法。如果有更好的方法来解决此问题,我想知道。
答案 0 :(得分:2)
BlockArrays.jl不仅支持2×2块数组,尽管它们在文档中曾经只使用它们。您可以轻松创建所需的3×3块6×6数组,如下所示:
M = BlockArray(fill(0im, 6, 6), [2, 2, 2], [2, 2, 2])
M[Block(1, 2)] = sy
M[Block(1, 3)] = adjoint(sy)
M[Block(2, 1)] = adjoint(sy)
M[Block(2, 3)] = sy
M[Block(3, 1)] = sy
M[Block(3, 2)] = adjoint(sy)
julia> M
3×3-blocked 6×6 BlockArray{Complex{Int64},2}:
0+0im 0+0im │ 0+0im 0-1im │ 0+0im 0-1im
0+0im 0+0im │ 0+1im 0+0im │ 0+1im 0+0im
──────────────┼────────────────┼──────────────
0+0im 0-1im │ 0+0im 0+0im │ 0+0im 0-1im
0+1im 0+0im │ 0+0im 0+0im │ 0+1im 0+0im
──────────────┼────────────────┼──────────────
0+0im 0-1im │ 0+0im 0-1im │ 0+0im 0+0im
0+1im 0+0im │ 0+1im 0+0im │ 0+0im 0+0im
但是要小心:这些块是通过引用存储的。因此,如果您随后修改sy
,则包含它的所有块也会被更改,反之亦然。如果要避免这种情况,请使用广播分配(.=
而非=
)。
如果您的问题实际上和示例中一样简单,而在密集方面更多,那么使用mortar
函数将可用块“粘在一起”可能会更简单:
julia> mortar(reshape([z, sy, sy', sy', z, sy, sy, sy', z], (3, 3)))
3×3-blocked 6×6 BlockArray{Complex{Int64},2,Array{AbstractArray{Complex{Int64},2},2},BlockArrays.BlockSizes{2,Array{Int64,1}}}:
0+0im 0+0im │ 0+0im 0-1im │ 0+0im 0-1im
0+0im 0+0im │ 0+1im 0+0im │ 0+1im 0+0im
──────────────┼────────────────┼──────────────
0+0im 0-1im │ 0+0im 0+0im │ 0+0im 0-1im
0+1im 0+0im │ 0+0im 0+0im │ 0+1im 0+0im
──────────────┼────────────────┼──────────────
0+0im 0-1im │ 0+0im 0-1im │ 0+0im 0+0im
0+1im 0+0im │ 0+1im 0+0im │ 0+0im 0+0im
尽管它在内部使用抽象类型,而不是提升分配的数组。