企业社会责任矩阵 - 矩阵乘法
CSR Matrix - Matrix multiplication
我有两个平方矩阵A
和B
我必须将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 Vector
乘积序列,对吗?因此,扩展上面显示的代码来执行此操作应该非常容易。
展望未来,我建议你不要自己编写这些例程。如果您使用的是C++(基于标签),那么您可以看看例如Boost ublas或Eigen。这些 API 乍一看似乎有点晦涩难懂,但从长远来看,这确实是值得的。首先,您可以访问更多功能,您将来可能需要这些功能。其次,这些实现将得到更好的优化。
相关文章:
- 在 Windows 问题上连接到企业 WiFi
- 企业架构师中的模型模板函数
- 企业架构师 - 单独的代码生成标头和实现
- 在机器学习中使用责任链模式
- 保证复制责任的行为是否取决于用户定义的复制构造函数的存在
- 我是否应该努力负责单一责任或最大程度地减少成员变量的数量
- TeamCity中的Visual Studio企业代码覆盖率报告
- 我必须实例化这个类吗?或者这是一个糟糕的责任分离
- 企业架构师错误:意外符号修复
- 何时违反单一责任原则
- 您如何为Sparx企业架构师逆向工程设置 #include 路径
- 遵守C C 标准的责任是什么
- 企业社会责任矩阵 - 矩阵乘法
- 继承深度、单一责任或 DRY
- 单一责任原则和集合
- 自动化每月小企业任务(VBA、VC++、Excel、Access、Quickbooks等)
- 我可以在 企业架构师中使用 c++ 中的反向 egineer 导入 doxygen 标签吗?
- 智能指针的依赖关系注入是否违反单一责任原则
- Qt:我的应用程序没有显示在我的企业硬件中,而在PC中显示
- 内存分配责任