我有一个稀疏矩阵D,我想将D_transpose和D相乘得到L,如下所示:
L = D'* D;
我使用sparseBLAS来处理稀疏矩阵,但是documentation说没有什么可以乘以两个稀疏矩阵。
我完全陷入困境,不知道如何继续。
D的尺寸通常约为500,000乘250,000。我根本无法分配那么多内存,因此必须使用稀疏矩阵来完成。
我是用MATLAB做的,如果MATLAB在接口下面也使用了sparseBLAS,我不明白MATLAB是怎么做的 - 或者是吗?如果没有,它有什么用?我也可以使用它。
感谢您的阅读!
编辑:解决了。我需要L矩阵乘以向量。因此,不是首先计算L,而是简单地做D'*(D * x),因此避免了两个稀疏矩阵的乘法的需要。我现在只做稀疏矩阵和密集向量乘法,由sparseBLAS支持。答案 0 :(得分:1)
实际上已在发布的文件中说明。
第11页
5.2使用稀疏BLAS矩阵
一旦完全构造了稀疏BLAS矩阵句柄(某事 可以通过检查属性blas_valid_handle来测试,有可能 使用矩阵句柄来执行操作。 此时显示的四个操作 支持表3.2和3.3。 除了使用稀疏BLAS矩阵执行操作之外,还可以 通过其句柄查询其属性。表5.5列出了可以使用的属性 通过调用get属性例程获得。
表3.3第4页
USMM稀疏矩阵 - 矩阵乘法
所以支持似乎就在那里。我找不到BLAS_usmm
函数的签名。也许你可以查看标题。
编辑:如果您从NIST获得了sparseBLas,则可以在blas_sparse_proto.h
文件中查看签名和参数的BLAS_*usmm
函数。
/* Level 3 Computational Routines */
int BLAS_susmm( enum blas_order_type order, enum blas_trans_type transa,
int nrhs, float alpha, blas_sparse_matrix A, const float *b, int ldb,
float *c, int ldc );
int BLAS_dusmm( enum blas_order_type order, enum blas_trans_type transa,
int nrhs, double alpha, blas_sparse_matrix A, const double *b,
int ldb, double *c, int ldc );
int BLAS_cusmm( enum blas_order_type order, enum blas_trans_type transa,
int nrhs, const void *alpha, blas_sparse_matrix A, const void *b,
int ldb, void *c, int ldc );
int BLAS_zusmm( enum blas_order_type order, enum blas_trans_type transa,
int nrhs, const void *alpha, blas_sparse_matrix A, const void *b,
int ldb, void *c, int ldc );
答案 1 :(得分:0)
据我所知,你的问题主要是在内存中存储巨大的矩阵。您可以将值存储在(行,列)对中。例如,
1 0 0
0 0 2
0 4 0
此矩阵可以存储在std::map<pair<int, int>, int>
中:
map[make_pair(1, 1)] = 1
map[make_pair(2, 3)] = 2
map[make_pair(3, 2)] = 4
现在是计算部分。假设第一个矩阵存储在map1
中,第二个矩阵存储在map2
中,答案存储在mapAns
中,
for each element x in map1:
for each element y in map2:
if x.column == y.row:
mapAns[x.row, y.column] += x.value * y.value
如果要在C中执行相同的操作,则需要使用类似自定义数据结构的地图。