高效迭代Kronecker积:矩阵与单位矩阵多次kron积的优化实现问询
问题描述
需要设计紧凑高效的算法,实现矩阵与单位矩阵的多次Kronecker积(kron)。当前手动嵌套的实现无法扩展到大规模场景(比如生成20个这类矩阵)。
当前代码示例:
import scipy.sparse as sp from scipy.sparse import csr_matrix A=[[0., 0.], [1., 0.]] Id=sp.identity(2) A_1=csr_matrix(sp.kron(A,sp.kron(Id,sp.kron(Id,Id)))) A_2=csr_matrix(sp.kron(Id,sp.kron(A,sp.kron(Id,Id)))) A_3=csr_matrix(sp.kron(Id,sp.kron(Id,sp.kron(A,Id)))) A_4=csr_matrix(sp.kron(Id,sp.kron(Id,sp.kron(Id,A))))
需求是通过循环批量生成这类矩阵,框架示例:
n_q=20 A_list=[] for i in range(i,n_q): A_i=csr_matrix(sp.kron(Id,...sp.kron(A...,sp.kron(Id,Id)))) A_list.append(A_i)
解决方案
可以利用Kronecker积的结合律,通过构造矩阵序列并累积计算的方式实现批量生成,避免手动嵌套。具体思路:
- 对每个目标位置
i,生成一个包含n_q个矩阵的序列:第i个元素是矩阵A,其余均为单位矩阵Id - 使用
functools.reduce依次对序列中的矩阵执行Kronecker积,最终得到目标矩阵A_i
实现代码如下:
import scipy.sparse as sp from scipy.sparse import csr_matrix from functools import reduce # 定义基础矩阵(提前转成稀疏格式,避免重复转换) A = csr_matrix([[0., 0.], [1., 0.]]) Id = sp.identity(2, format='csr') n_q = 20 A_list = [] for idx in range(n_q): # 构造矩阵序列:仅第idx位是A,其余为Id mat_sequence = [Id if i != idx else A for i in range(n_q)] # 累积计算Kronecker积 A_i = reduce(sp.kron, mat_sequence) A_list.append(A_i)
优化说明
- 稀疏性保持:所有矩阵都用csr稀疏格式存储,Kronecker积操作针对稀疏矩阵优化,避免稠密矩阵带来的内存爆炸问题,适合大规模场景
- 代码扩展性:只需修改
n_q的值即可生成任意数量的目标矩阵,无需手动调整嵌套层级 - 效率提升:
reduce的累积计算方式和scipy内置的稀疏kron实现,比手动嵌套更简洁且性能一致
内容的提问来源于stack exchange,提问作者J.Agusti
相关产品推荐
相关产品推荐

