在Python中设置所有对角分块矩阵为零矩阵

问题描述 投票:0回答:1
bnds = [(0, 0) if i == j else (0, None) for _ in range(2) for i in range(d) for j in range(d)]

上面的代码是针对dxd矩阵大小的。上面的代码是强制矩阵的所有对角线项为零。对于所有其他条目,我们只需将其设置为任意数量的 (0, None),我相信它是任何非负数。

现在我需要修改上面的代码。原始矩阵是dxd。现在我有一个 Kd x Kd matirx,其中每个 d 有 KxK 块矩阵。对于这个大的 Kd x Kd 矩阵,我需要所有对角 KxK 块矩阵为零矩阵。

例如,假设 d=20 且 K=5。那么前5行和前5列的矩阵应该是零矩阵。 [6:10, 6:10] 的矩阵也应该是零矩阵,等等...

在 R 中,我知道索引是

index0 = ((j - 1) * K + 1) : (j * K)
index1 = ((l - 1) * K + 1) : (l * K)

但是在Python中,起始索引和结束索引是不同的。我不确定我的尝试是否正确。我目前的尝试是:

bnds = []
for i in range(1, K*d+1):
    for j in range(1, K*d+1):
        block_row = (i - 1) // K
        block_col = (j - 1) // K
        row_start = block_row * K + 1
        row_end = row_start + K
        col_start = block_col * K + 1
        col_end = col_start + K
        if block_row == block_col:
            bnds.append((0, 0)) 
        else:
            bnds.append((0, None))

我是Python新手。请评论我上面的代码。谢谢你。

python
1个回答
0
投票

从 Kd x Kd 非零矩阵开始:

side_size = K * d
bnds = [(0, None) for i in range(side_size) for j in range(side_size)]

然后使用嵌套循环将对角子矩阵替换为零。

for k in range(0, side_size, K): # k = top-left corner of sub-matrix
    for i in range(k, k+K):
        for j in range(k, k+K):
            bnds[i * side_size + j] = (0, 0)
© www.soinside.com 2019 - 2024. All rights reserved.