python - 将 CSR 矩阵乘以向量
问题描述
我正在关注this stackoverflow post on csr matrix multiplication to a vector 并在python中实现它并获取列表超出范围错误。
这是我的代码:
def MatrixMultiplication(data,row_ptr,col_ptr,vec):
ResultMatrix =[]
vec_len = len(vec)
for i in range(0,vec_len):
ResultMatrix.insert(i,0)
for i in range(0,vec_len):
start, end = row_ptr[i], row_ptr[i + 1]
for k in range(start, end):
ResultMatrix[i] = ResultMatrix[i]+data[k]*vec[col_ptr[k]]
return ResultMatrix
data = [2, 4, 7, 1, 3, 2]
row_ptr = [2,3 ,5, 5 ,6]
col_ptr = [1 ,3, 4, 0, 3, 3]
vec = [2,3, 5, 4, 2]
MatrixMultiplication(data,row_ptr,col_ptr,vec)
请帮我解决我哪里出错了。
输出应该是:[22 14 14 0 8]
错误 :
IndexError: list index out of range
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<command-338158343473691> in <module>()
----> 1 MatrixMultiplication(data,row_ptr,col_ptr,vec)
<command-3658506804172571> in MatrixMultiplication(data, row_ptr, col_ptr, vec)
5 ResultMatrix.insert(i,0)
6 for i in range(0,vec_len):
----> 7 start, end = row_ptr[i], row_ptr[i + 1]
8 for k in range(start, end):
9 ResultMatrix[i] = ResultMatrix[i]+data[k]*vec[col_ptr[k]]
IndexError: list index out of range
供参考:
row_ptr 的最后一个元素将是数据列表的大小
解决方案
错误消息非常不言自明:您尝试row_ptr[i + 1]
在一个上升到 的 for 循环中访问vec_len
,这是您的列表的长度。当您到达 for 循环的最后一次迭代时i = vec_len - 1
,然后i + 1 = vec_len
, 超出了列表的范围(请记住,Python 列表是 0 初始化的)。
为了防止这个错误,你的范围应该只vec_len - 1
在你的第二个 for 循环中上升。
推荐阅读
- node.js - 如何列出 package.json 中所有可用的命令?
- angular - 我无法导航到另一个路由器插座
- java - 致命异常:CameraX 音频编码线程
- sql - 如何从重复值 Oracle SQL 查询中获取第一行
- html - 在 Angular8 的资产文件夹中获取不同的徽标构建
- android - 安卓相机X | 颜色检测
- python - 一行中的所有匹配项:Spacy 匹配器
- sql-server - SQL Server 2017 触发器将旧值作为更新后的新值
- git - git diff 如何判断一行是否已被修改或添加?
- git - 当我在终端中输入 git commit 时,我不会被发送到文本编辑器。怎么了?