如何用Python的block_diag函数构造指定分块对角矩阵
分块对角矩阵构造方法与原理解析
一、第一类矩阵(重复N个A)的代码原理
你能用的me = sparse.block_diag(A for _ in range(int(N)))能运行,核心要搞懂两点:
sparse.block_diag的输入要求:它只接受可迭代的矩阵/数组序列,会把序列里的每个矩阵依次放在大矩阵的对角线上,拼成分块对角矩阵。A for _ in range(int(N))是Python的生成器表达式:它会循环N次,每次输出一个A,相当于生成了一个包含N个A的可迭代序列,不用提前把所有A存成列表,能节省内存。
简单说就是:告诉block_diag「把A重复N次,挨个放在对角线上」。
二、第二类矩阵(首尾k+中间N个A)的正确实现
你之前的写法报错,根源有两个:
sparse.block_diag只接受一个可迭代序列参数,你直接传k, 生成器, k相当于传了三个参数,不符合接口要求。- k是单个实数,不是矩阵/数组,block_diag无法直接把标量当成对角块,必须把k转换成1x1的矩阵形式。
正确写法示例
from scipy import sparse # 把k转成1x1的稀疏矩阵,让block_diag能识别为对角块 k_block = sparse.csr_matrix([[k]]) # 拼接出完整的块序列:首块k + 中间N个A + 尾块k blocks = [k_block] + [A for _ in range(int(N))] + [k_block] # 构造目标分块对角矩阵 mo = sparse.block_diag(blocks)
简化写法(用numpy数组包装k)
如果不想用稀疏矩阵包装k,也可以用numpy的1x1数组,block_diag会自动转成稀疏矩阵处理:
import numpy as np from scipy import sparse k_block = np.array([[k]]) blocks = [k_block] + [A]*int(N) + [k_block] mo = sparse.block_diag(blocks)
额外注意点
- 如果A本身是稀疏矩阵,整个构造过程都是稀疏操作,效率很高;如果A是numpy数组,block_diag会自动将其转换为稀疏矩阵。
- 生成器表达式
A for _ in range(N)和列表[A]*N的区别:前者按需生成A实例,后者直接创建N个A的引用(如果A是可变对象如numpy数组,两者效果一致,但生成器更节省内存)。
内容的提问来源于stack exchange,提问作者ceciled
相关产品推荐
相关产品推荐

