csc_matrix稀疏矩阵理解

描述

Apollo轨迹规划中,横向轨迹优化使用的OSQP的二次规划求解器,其中通过调用csc_matrix()进行构建矩阵,即稀疏矩阵。
度娘:在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。

参考源

大神们的解释,丰富而精彩:
scipy csr_matrix和csc_matrix函数详解
csc_matrix、coo_matrix

稀疏矩阵的常规方式

下面是最常见的一种,也很好理解,(row,col)指向矩阵非零元素的索引,data里为该元素的值。

>>> row = array([0,2,2,0,1,2])
>>> col = array([0,0,1,2,2,2])
>>> data = array([1,2,3,4,5,6])
>>> csc_matrix( (data,(row,col)), shape=(3,3) ).todense()
matrix([[1, 0, 4],
        [0, 0, 5],
        [2, 3, 6]])

即 row[i], col[i]存储的数据为data[i]。
从row和col的值,可以看到非零元素值出现的位置为(0,0),(2,0) ,(2,1) ,(0,2),(1,2),(2,2),依次填入data值即可。

csc_matrix

按列压缩CSC—Compressed sparse column
顾名思义将每一列出现的非零元素的个数统计后放好…


>>> indptr = np.array([0, 2, 3, 6])
>>> indices = np.array([0, 2, 2, 0, 1, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6])
>>> csc_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 4],
       [0, 0, 5],
       [2, 3, 6]])

这个是大家分享用到的示例,比较正规的描述:

indptr表示的是indices矩阵里的开始和结尾的index, indptr [0, 2]表示indices[0:2]存储了第一列的数据所位置0行和2行,indices[2:3]存储了第二列的数据位置,即2,第2行(注意从0行开始), 每个indices[i]对应一个data[i]。
链接:https://www.jianshu.com/p/6248d3a307a1

比较快速的理解就是:indptr[i+1]表示稀疏矩阵的第i列(包括i列)之前一共有多少个非零元素,这些非零元素对应的行,依次在indices 中取出来即可。
第0列的非零元素个数为indptr[0+1]-indptr[0]=2-0=2个,从indices中可知对应的非零元素在0、2行,data对应的值为1、2,则第0列为{1 0 2};
第1列的非零元素个数为indptr[1+1]-indptr[1]=3-2=1个,从indices中可知对应的非零元素在2行,data对应的值为3,则第1列为{0 0 3};
第2列的非零元素个数为indptr[2+1]-indptr[2]=6-3=3个,从indices中可知对应的非零元素在0、1、2行,data对应的值为4、5、6,则第2列为{4 5 6};
得到完整的矩阵。

csr_matrix

按行压缩CSR—Compressed sparse row
原理和CSC类似。

  • 21
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值