C++ CSR矩阵-矩阵乘法

C++ CSR矩阵-矩阵乘法,c++,algorithm,matrix,sparse-matrix,matrix-multiplication,C++,Algorithm,Matrix,Sparse Matrix,Matrix Multiplication,我有两个方阵A和B 我必须将B转换为CSR格式,并确定产品C A * B_csr = C 我在网上找到了很多关于这方面的信息。算法是: for (k = 0; k < N; k = k + 1) result[i] = 0; for (i = 0; i < N; i = i + 1) { for (k = RowPtr[i]; k < RowPtr[i+1]; k = k + 1) { result[i] = result[i] + Val[k]

我有两个方阵
A
B

我必须将
B
转换为
CSR格式
,并确定产品
C

A * B_csr = C
我在网上找到了很多关于这方面的信息。算法是:

for (k = 0; k < N; k = k + 1)
  result[i] = 0;

for (i = 0; i < N; i = i + 1)
{  
  for (k = RowPtr[i]; k < RowPtr[i+1]; k = k + 1)
  {  
    result[i] = result[i] + Val[k]*d[Col[k]];
  }  
}
(k=0;k 结果[i]=0; 对于(i=0;i 但是,我需要
Matrix-Matrix
乘法

此外,似乎大多数算法在我需要的地方应用了
A*B\u csr
乘法。我的解决方案是在转换之前先转换两个矩阵,然后再转换最终的乘积


有人能解释一下如何计算
矩阵-CSR矩阵
产品和/或
CSR矩阵-Matrix
产品吗?

这里是一个简单的Python解决方案,用于
密集矩阵X CSR矩阵
。这应该是不言自明的

def main():
  # 4 x 4 csr matrix
  #    [1, 0, 0, 0],
  #    [2, 0, 3, 0],
  #    [0, 0, 0, 0],
  #    [0, 4, 0, 0],
  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],
      ]

  # matrix order, assumes both matrices are square
  n = len(dense_matrix)

  # res = dense X csr
  csr_row = 0 # Current row in CSR matrix
  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矩阵X稠密矩阵
实际上只是稠密矩阵每行的
CSR矩阵X向量
乘积的序列,对吗?因此,扩展上面显示的代码来实现这一点应该非常容易


接下来,我建议您不要自己编写这些例程。如果你使用C++(基于标签),那么你可以看看,例如。这些API一开始似乎有点神秘,但从长远来看确实值得。首先,您可以访问更多功能,这在将来可能需要。其次,这些实现将得到更好的优化。

在第一个循环中,什么是
i
?另外,什么是
结果
,它是如何启动的,它包含什么类型?什么是
val
col
?什么是
RowPtr
?什么是
d
?@bjpelcdev
i
将是
C
的第i个
索引。其他值指与
CSR
格式相关的向量。无论如何,我只是提供了一个算法供参考,尽管我对另一个案例感兴趣。