切片矩阵是cvxopt中的视图还是副本?

计算科学 矩阵
2021-11-27 05:07:26

众所周知,Numpy 基本矩阵切片会生成一个视图,而高级切片会生成一个副本。这在 cvxopt 中是真的吗?我试过了

from cvxopt import spmatrix
import numpy as np
A = spmatrix([2,-1,2,-2,1,4,3], [1,2,0,2,3,2,0], [0,0,1,1,2,3,4])
A_view = A[0:3,0:3]           # basic slicing
A_cp = A[[0,1,2],[0,1,2]]     # advanced slicing
np.may_share_memory(A,A_view) # returned false
np.may_share_memory(A,A_cp)   # returned false
1个回答

那是一个稀疏矩阵。Numpy 没有稀疏矩阵,我认为既不scipy.sparse也不cvxopt将 memoryviews 用于稀疏矩阵。

即使对于密集矩阵,它似乎也cvxopt使用低级 Python API 而不是 Cython 之类的东西。我没有看到任何对 memoryview 接口的引用,因此甚至可能cvxopt使用复制而不是视图的密集矩阵。

这可能是 cvxopt 源中稀疏矩阵索引的相关函数,您会在其中找到大量复制。 https://github.com/cvxopt/cvxopt/blob/master/src/C/sparse.c#L2791