2013-09-05 41 views
1

我有一个稀疏矩阵D,我想乘以D_transpose和D来获得L,如下所示:我如何乘以C中的两个稀疏矩阵?

L = D'* D;

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

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

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

我用MATLAB做了这个,我不明白MATLAB如何在它的界面下面使用sparseBLAS - 或者它是这样做的吗?如果不是,它使用什么?我也可以使用它。

谢谢您的阅读!

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

+0

您也可以从C应用程序调用Matlab函数。搜索“Matlab编译器运行时”。 – Nemo

回答

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.

+0

他并不是在问如何实现稀疏矩阵,因为他已经在使用支持它的库。 – RedX

+0

对于大矩阵,COO格式通常效率不高。 (取决于非零值的数量) – Michael

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); 
+0

谢谢。其实我正在寻找乘两个稀疏矩阵,而不是一个密集矩阵的稀疏矩阵。你描述的功能是针对后者的情况。不过,我发现了一种避开这个问题的方法。感谢您的输入! – user1096863