MATLAB中P(peo,peo)=W(peo,peo)的Python等效实现(保复杂度)
MATLAB稀疏矩阵子块赋值的Python等价实现
当然存在对应的Python实现,且能保持和MATLAB操作相同的计算与时间复杂度,核心是借助SciPy的稀疏矩阵工具完成,具体操作如下:
前置准备
确保已导入所需库:
import numpy as np import scipy.sparse as sp
索引适配
MATLAB使用1基索引,Python采用0基索引。如果peo向量是从MATLAB导出的,需先转换为0基:
peo = np.asarray(peo) - 1 # 仅当peo为MATLAB风格1基索引时执行
实现步骤
假设P是SciPy的稀疏矩阵(推荐使用与MATLAB一致的csc_matrix格式),W可以是稠密矩阵(numpy.ndarray)或稀疏矩阵:
提取W的目标子块
if isinstance(W, sp.spmatrix): w_sub = W[peo, peo] else: # 稠密矩阵提取子块后转成CSC格式稀疏矩阵 w_sub = sp.csc_matrix(W[peo][:, peo])对稀疏矩阵P的指定子块赋值
CSC/CSR格式的稀疏矩阵不适合直接修改,先转换为LIL格式(便于灵活修改),完成赋值后再转回原格式:# 转换为LIL格式 P_lil = P.tolil() # 清空目标子块旧值 P_lil[peo, peo] = 0 # 赋值新子块值 P_lil[peo, peo] = w_sub # 转回CSC格式(保持与MATLAB存储一致) P = P_lil.tocsc()
时间复杂度说明
上述操作的时间复杂度为O(k²)(k为peo向量的长度),与MATLAB中的P(peo, peo) = W(peo, peo)完全一致,两者都是针对k×k的子块进行赋值操作,稀疏矩阵格式的合理转换保证了操作效率。
内容的提问来源于stack exchange,提问作者Anto
相关产品推荐
相关产品推荐

