Bri*_*ian 5 c++ algorithm matrix sparse-matrix matrix-multiplication
我有两个方阵A和B
我必须转换B到CSR Format并确定产品C
A * B_csr = C
Run Code Online (Sandbox Code Playgroud)
我在网上找到了很多关于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]];
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我需要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()
Run Code Online (Sandbox Code Playgroud)
CSR Matrix X Dense Matrix真的只是CSR Matrix X Vector密集矩阵每一行的乘积序列,对吗?因此,扩展上面显示的代码来执行此操作应该非常容易。
展望未来,我建议您不要自己编写这些例程。如果您使用 C++(基于标签),那么您可以看看Boost ublas或Eigen等。这些 API 乍一看可能有点神秘,但从长远来看,它确实是值得的。首先,您可以访问更多的功能,这些功能您将来可能会需要。其次,这些实施将得到更好的优化。
| 归档时间: |
|
| 查看次数: |
7067 次 |
| 最近记录: |