这里有一个Python的简单解决方案,用于 密集矩阵X CSR矩阵
的转换。它应该很容易理解。
def main():
csr_values = [1, 2, 3, 4]
col_idx = [0, 0, 2, 1]
row_ptr = [0, 1, 3, 3, 4]
csr_matrix = [
csr_values,
col_idx,
row_ptr
]
dense_matrix = [
[1, 3, 3, 4],
[1, 2, 3, 4],
[1, 4, 3, 4],
[1, 2, 3, 5],
]
res = [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
]
n = len(dense_matrix)
csr_row = 0
for i in range(n):
start, end = row_ptr[i], row_ptr[i + 1]
for j in range(start, end):
col, csr_value = col_idx[j], csr_values[j]
for k in range(n):
dense_value = dense_matrix[k][csr_row]
res[k][col] += csr_value * dense_value
csr_row += 1
print res
if __name__ == '__main__':
main()
CSR Matrix X Dense Matrix
实际上只是针对密集矩阵的每一行进行
CSR Matrix X Vector
乘积的序列。所以,扩展您上面展示的代码以执行此操作应该非常容易。
未来,我建议您不要自己编写这些例程。如果您正在使用C++(基于标签),则可以查看例如
Boost ublas或
Eigen。API可能一开始看起来有点神秘,但从长远来看它真的很值得。首先,您可以获得更多功能,这在将来可能会需要。其次,这些实现将更好地优化。
i
是什么?另外,result
是什么,它是如何初始化的,它包含什么类型?val
和col
是什么?RowPtr
是什么?d
是什么? - bjpelcdevi
将是C
的第ith
个索引。其他值指的是与CSR
格式相关联的向量。无论如何,我只是提供算法作为参考,尽管我对另一种情况很感兴趣。 - Brian