Python中如何高效求大型稀疏数组逆并与向量相乘?
稀疏数组伪逆运算的高效优化方案
你当前通过np.linalg.pinv()求伪逆再与向量相乘的做法,本质是求解R3_mod @ X ≈ P2的最小二乘解。直接针对最小二乘问题求解,比先计算完整伪逆再做乘法更高效,尤其是针对含大量零元素的数组:
方案1:用Numpy原生最小二乘函数直接求解
无需先求伪逆,np.linalg.lstsq()会通过更高效的矩阵分解(如QR分解)直接得到解,底层实现比pinv()+dot()更优化:
import numpy as np X, residuals, rank, singular_values = np.linalg.lstsq(R3_mod, P2, rcond=None)
方案2:利用稀疏矩阵库进一步优化
如果R3_mod的零元素占比极高,可以将其转为稀疏矩阵格式,用SciPy的稀疏最小二乘工具求解,能跳过零元素的无效运算,大幅降低内存占用和计算时间(即使当前21x21规模差异不大,后续规模扩展时优势会更明显):
from scipy.sparse import csr_matrix from scipy.sparse.linalg import lsqr # 转为压缩稀疏行格式 R3_sparse = csr_matrix(R3_mod) # 求解最小二乘解,取返回结果的第一个元素 X = lsqr(R3_sparse, P2)[0]
补充说明
21x21的矩阵本身规模很小,两种优化方案的速度差异可能不显著,但从算法原理和扩展性来看,直接求解最小二乘是更优的思路,避免了伪逆计算中不必要的矩阵运算。
内容的提问来源于stack exchange,提问作者modishah123
相关产品推荐
相关产品推荐

