【发布时间】:2020-03-24 18:36:57
【问题描述】:
简而言之,这是我的问题: 在 Tux Eigen (C++) 中为(未排序的)coo 矩阵生成映射的正确代码是什么?
以下代码成功为压缩行存储 (crs/csr) 格式的稀疏矩阵生成映射 A_map,该矩阵存储在 crs_structure A1 中。 (我使用metis 表示法。m=rows,n=cols,nnz=#nonzeros。)
Eigen::Map<Eigen::SparseMatrix< double,Eigen::RowMajor,myInt>> A_map(A1.m,A1.n,A1.nnz,A1.adj,A1.adjncy,A1.values,NULL );
我使用以下代码尝试为坐标存储 (coo) 格式的稀疏矩阵生成地图 A_map,该矩阵存储在 coo_structure A2 中。 ptrI,ptrJ,ptrV 是 int64*,int64*,double*,给出 ptrV 中值的行坐标。
Eigen::Map<Eigen::SparseMatrix< double,Eigen::RowMajor,myInt>> A_map(A2.m,A2.n,A2.nnz,A2.ptrI,A2.ptrJ,A2.ptrV,innerNonZerosPtr);
我需要地图,因为我想将 Eigen 的稀疏矩阵向量积 (matvec) 与我的进行基准测试。
一般来说,A 的所有索引都没有排序。 否则,可以从 $\cO(nnz)$ 中的 coo 格式创建 csr 格式,从而绕过该问题。
这不是一个选项,因为对索引进行排序比计算 matvec 消耗更多的时间。
旁注: 我不明白“innerNonZerosPtr”是什么意思;我未能在 Eigen 文档中找到它的实际解释。 可能,了解它在我的场景中的意图和有目的的使用可以解决我的问题。
干杯,非常感谢您的帮助。
【问题讨论】:
标签: c++ sparse-matrix eigen eigen3