如何从MATLAB稀疏矩阵获取压缩列存储(CCS)相关向量?
获取MATLAB稀疏矩阵的压缩列存储(CSC)数组
好消息!MATLAB其实内置了直接获取压缩列存储(CSC)格式核心数组的方法,完全不需要手动移植C++代码来转换~
步骤说明:
首先把你的密集矩阵转换成稀疏矩阵对象:
A = [1 3 0 2 0; 0 1 0 0 2; 0 0 4 0 0; 1 0 0 0 4; 0 2 0 2 0]; S = sparse(A);
MATLAB的稀疏矩阵本身就是以CSC格式存储的,你可以直接访问它的三个内置属性来得到需要的数组:
- values数组:访问
S.V,得到所有非零元素的值,顺序是按列优先排列的,和标准CSC格式的values完全一致。 - row_index数组:访问
S.I,得到每个非零元素对应的行索引(注意MATLAB的索引是从1开始的,和部分编程语言的0索引不同)。 - column_pointer数组:访问
S.Jc,这是列指针数组,长度为矩阵列数+1,最后一个元素等于总非零元素的数量,完全符合CSC格式的定义。
验证示例(针对你的矩阵):
对于你给出的矩阵A,执行上述代码后:
S.V的结果是:[1; 1; 3; 1; 2; 4; 2; 2; 2; 4](按列遍历的所有非零元素)S.I的结果是:[1; 4; 1; 2; 5; 3; 1; 5; 2; 4](对应每个非零元素的行号)S.Jc的结果是:[1; 3; 6; 7; 9; 11](列指针,标记每一列非零元素在S.V和S.I中的起始/结束位置)
额外提示:
这些属性是只读的,如果你需要修改稀疏矩阵,建议通过sparse()、nonzeros()等官方函数操作,而不是直接修改这些属性。另外,如果你之前用find()得到了三元组形式的(i,j,v),也可以先通过S = sparse(i,j,v)转换成CSC稀疏矩阵,再访问上述属性。
内容的提问来源于stack exchange,提问作者Morpheus
相关产品推荐
相关产品推荐

