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

如何在C语言中乘以两个稀疏矩阵?,c,blas,sparse-matrix,C,Blas,Sparse Matrix,我有一个稀疏矩阵D,我想乘以D_转置和D得到L,如下所示: L=D'*D 我用sparseBLAS来处理稀疏矩阵,但是上面说两个稀疏矩阵不能相乘 我完全被卡住了,不知道如何继续 D的尺寸通常约为500000×250000。我根本无法分配那么多内存,所以只能使用稀疏矩阵 我是用MATLAB做的,如果MATLAB在接口下面也使用sparseBLAS,我不明白MATLAB是怎么做的——或者说是这样吗?如果没有,它使用什么?我也可以用 谢谢你的阅读 编辑:已解决。我需要L矩阵与向量相乘。因此,我没有首先

我有一个稀疏矩阵D,我想乘以D_转置和D得到L,如下所示:

L=D'*D

我用sparseBLAS来处理稀疏矩阵,但是上面说两个稀疏矩阵不能相乘

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

D的尺寸通常约为500000×250000。我根本无法分配那么多内存,所以只能使用稀疏矩阵

我是用MATLAB做的,如果MATLAB在接口下面也使用sparseBLAS,我不明白MATLAB是怎么做的——或者说是这样吗?如果没有,它使用什么?我也可以用

谢谢你的阅读


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

据我所知,您的问题主要是在内存中存储巨大的矩阵。您可以将值存储在(行、列)对中。比如说,

1 0 0
0 0 2
0 4 0
该矩阵可存储在
std::map
中,如下所示:

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中使用类似于地图的自定义数据结构,则需要使用该结构。

据我所知,您的问题主要是在内存中存储巨大的矩阵。您可以将值存储在(行、列)对中。比如说,

1 0 0
0 0 2
0 4 0
该矩阵可存储在
std::map
中,如下所示:

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中使用类似于地图的自定义数据结构,则需要使用该结构。

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

第11页

5.2使用稀疏BLAS矩阵

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

表3.3第4页

稀疏矩阵乘法

因此,支持似乎存在。我就是找不到
BLAS_usmm
函数的签名。也许你可以查看标题

编辑:如果您从获得sparseBLas,您可以检查
blas\u sparse\u proto.h
文件中的
blas\u*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 );

事实上,它是在张贴的文件中说明的

第11页

5.2使用稀疏BLAS矩阵

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

表3.3第4页

稀疏矩阵乘法

因此,支持似乎存在。我就是找不到
BLAS_usmm
函数的签名。也许你可以查看标题

编辑:如果您从获得sparseBLas,您可以检查
blas\u sparse\u proto.h
文件中的
blas\u*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 );

您还可以从C应用程序中调用Matlab函数。搜索“Matlab编译器运行时”。您也可以从C应用程序中调用Matlab函数。搜索“Matlab编译器运行时”。他没有询问如何实现稀疏矩阵,因为他已经在使用一个支持稀疏矩阵的库。对于大型矩阵,COO格式通常效率不高。(取决于非零值的数量)他没有询问如何实现稀疏矩阵,因为他已经在使用一个支持稀疏矩阵的库。对于大型矩阵,COO格式通常效率不高。(取决于非零值的数量)谢谢。实际上,我想把两个稀疏矩阵相乘,而不是一个稀疏矩阵和一个稠密矩阵相乘。您描述的功能适用于后一种情况。不过,我找到了规避这个问题的方法。谢谢你的意见!非常感谢。实际上,我想把两个稀疏矩阵相乘,而不是一个稀疏矩阵和一个稠密矩阵相乘。您描述的功能适用于后一种情况。不过,我找到了规避这个问题的方法。谢谢你的意见!