如何在C中乘以两个稀疏矩阵?

时间:2013-09-05 13:18:04

标签: c blas sparse-matrix

我有一个稀疏矩阵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支持。

2 个答案:

答案 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中执行相同的操作,则需要使用类似自定义数据结构的地图。