1

我有一个稀疏矩阵 D,我想将 D_transpose 和 D 相乘得到 L,如下所示:

L = D'*D;

我正在使用 sparseBLAS 处理稀疏矩阵,但文档说没有什么可以将两个稀疏矩阵相乘。

我完全被卡住了,不知道如何继续。

D 的尺寸通常约为 500,000 x 250,000。我根本无法分配那么多内存,所以只能使用稀疏矩阵来完成。

我使用 MATLAB 完成了这项工作,如果 MATLAB 在接口下也使用 sparseBLAS,我不明白它是如何做到的 - 或者是吗?如果不是,它有什么用?我也可以用那个。

感谢您的阅读!

编辑:解决。我需要 L 矩阵与向量相乘。因此,我没有首先计算 L,而是简单地做了 D'*(D*x),从而避免了两个稀疏矩阵相乘的需要。我现在只做稀疏矩阵和密集向量乘法,sparseBLAS 支持。

4

2 回答 2

1

它实际上已在发布的文档中说明。

第 11 页

5.2 使用稀疏 BLAS 矩阵

一旦一个稀疏的 BLAS 矩阵句柄被完全构造(可以通过检查属性 blas_valid_handle 进行测试),就可以使用矩阵句柄来执行操作。此时支持表 3.2 和表 3.3 所示的四种操作。 除了使用稀疏 BLAS 矩阵执行操作外,还可以通过其句柄查询其属性。表 5.5 列出了可以通过调用 get properties 例程获得的属性。

表 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 );
于 2013-09-05T13:55:39.173 回答
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 中做同样的事情,你需要使用类似自定义数据结构的映射。

于 2013-09-05T13:34:07.900 回答