矩阵块索引

时间:2019-04-07 19:33:28

标签: arrays matrix multidimensional-array julia

我正在使用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)
...

现在我不清楚人们实际上将如何处理并编写这样的视图矩阵,或者这是否是解决问题的可行方法。如果有更好的方法来解决此问题,我想知道。

1 个答案:

答案 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

尽管它在内部使用抽象类型,而不是提升分配的数组。