CSC:压缩列存储格式(稀疏矩阵的一种存储方式)
用三个一维数组表示一个稀疏矩阵(很多 0 的矩阵)
OSQP 强制要求 P 与 A 都用 CSC 格式

为什么要用 CSC?
因为稀疏矩阵大多数元素都是 0,用普通二维数组存太浪费
CSC 只存:
非零元素的值
非零元素所在的行
每一列从哪里开始
所以不用存 0,省空间,也加速计算

CSC 使用三个数组
一个稀疏矩阵:

A = \begin{bmatrix} 1& 0& 2\\ 0& 3& 0\\ 4& 0& 5 \end{bmatrix}

A_data
按列把非零元素存在一起

A_data = [1,4, 3, 2,5]

A_indices
非零元素所在行

A_indices = [0,2, 1, 0,2]

A_indptr
每一列非零元素在 A_data 的起始位置的索引

A_indptr = [0, 2, 3, 5]

CSC 用三个一维数组表示一个二维稀疏矩阵:

A = {A_data, A_indices, A_indptr}

它是个二维矩阵,只是存储方式变成了 3 个一维数组
OSQP 就要这种格式

csc_matrix(n, n, P_data->size(), P_data->data(),
           P_indices->data(), P_indptr->data());

想象你有一个矩阵:

元素
0 1, 4
1 3
2 2, 5

CSC 就是把这些列“挤压”成紧凑结构:
data 放所有非零的值
indices 告诉你这些值来自哪一行
indptr 告诉你:某一列的元素从 data 的哪个 index 开始