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
?@bjpelcdevi
将是C
的第i个索引。其他值指与CSR
格式相关的向量。无论如何,我只是提供了一个算法供参考,尽管我对另一个案例感兴趣。