簡體   English   中英

CSR矩陣 - 矩陣乘法

[英]CSR Matrix - Matrix multiplication

我有兩個方陣矩陣AB

我必須將B轉換為CSR Format並確定產品C

A * B_csr = C

我在網上找到了很多關於CSR矩陣 - 矢量乘法的信息 算法是:

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]];
  }  
}

但是,我需要Matrix - Matrix乘法。

此外,似乎大多數算法都應用A_csr - vector乘法,其中我需要A * B_csr 我的解決方案是在轉換之前轉置兩個矩陣然后轉置最終產品。

有人可以解釋如何計算Matrix - CSR Matrix產品和/或CSR Matrix - Matrix產品嗎?

這是Python中用於Dense Matrix X CSR Matrix的簡單解決方案。 它應該是不言自明的。

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 Matrix X Dense Matrix實際上只是CSR Matrix X Dense Matrix每一行的CSR Matrix X Vector產品序列對嗎? 因此,擴展上面顯示的代碼應該非常容易。

繼續前進,我建議你不要自己編寫這些例程。 如果您正在使用C ++(基於標記),那么您可以查看Boost ublasEigen API起初看起來有點神秘,但從長遠來看它確實值得。 首先,您可以訪問更多功能,將來可能需要這些功能。 其次,這些實現將得到更好的優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM