如何在Python中创建或扩展分块对角矩阵(类单位矩阵)
分块对角矩阵拼接实现方法
你需要将两个子矩阵拼接成指定的分块对角矩阵,本质是构造主对角线为子矩阵、其余位置为0的分块对角矩阵。
已知子矩阵:
第一个2×2子矩阵:
[[1 2], [3 4]]
第二个3×3子矩阵:
[[5 0 0], [0 6 0], [0 0 7]]
目标矩阵:
[[1 2 0 0 0], [3 4 0 0 0], [0 0 5 0 0], [0 0 0 6 0], [0 0 0 0 7]]
Python(NumPy)
用NumPy的block函数或Scipy的block_diag都能快速实现:
方法1:使用numpy.block
import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 0, 0], [0, 6, 0], [0, 0, 7]]) # 按分块结构拼接 result = np.block([ [A, np.zeros((A.shape[0], B.shape[1]))], [np.zeros((B.shape[0], A.shape[1])), B] ]) print(result)
方法2:使用scipy.linalg.block_diag(更简洁)
from scipy.linalg import block_diag result = block_diag(A, B) print(result)
MATLAB
MATLAB直接用内置的blkdiag函数即可:
A = [1 2; 3 4]; B = [5 0 0; 0 6 0; 0 0 7]; result = blkdiag(A, B); disp(result);
手动构造(通用逻辑)
如果不想用现成函数,核心思路是先创建对应大小的全0矩阵,再把两个子矩阵放到对应位置:
import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 0, 0], [0, 6, 0], [0, 0, 7]]) # 初始化全0结果矩阵 result = np.zeros((A.shape[0]+B.shape[0], A.shape[1]+B.shape[1]), dtype=int) # 把A放到左上角 result[:A.shape[0], :A.shape[1]] = A # 把B放到右下角 result[A.shape[0]:, A.shape[1]:] = B print(result)
内容的提问来源于stack exchange,提问作者sxie
相关产品推荐
相关产品推荐

