2015-02-23 72 views
4

我认为Eigen使用压缩方法来存储稀疏矩阵。有什么方法可以从std :: vectors中提取特征稀疏矩阵的Triplet格式向量?将特征矩阵转换为三元组形式C++

谢谢。

A= 
3 0 4 0 
0 0 1 0 
0 2 0 5 
4 0 0 0 

i = 1 1 2 3 3 4 // row 
j = 1 3 3 2 4 1 // column 
S = 3 4 1 2 5 4 // values 

回答

1

只需如图所示tutorial

更多信息(三重格式的例子)矩阵的 三重格式

#include <Eigen/Sparse> 
#include <iostream> 

using namespace Eigen; 
using std::cout; 
using std::endl; 

typedef Triplet<int> Trip; 

int main(int argc, char *argv[]){ 

    std::vector<Trip> trp, tmp; 

    // I subtracted 1 from the indices so that the output matches your question 
    trp.push_back(Trip(1-1,1-1,3)); 
    trp.push_back(Trip(1-1,3-1,4)); 
    trp.push_back(Trip(2-1,3-1,1)); 
    trp.push_back(Trip(3-1,2-1,2)); 
    trp.push_back(Trip(3-1,4-1,5)); 
    trp.push_back(Trip(4-1,1-1,4)); 

    int rows, cols; 
    rows = cols = 4; 
    SparseMatrix<int> A(rows,cols); 

    A.setFromTriplets(trp.begin(), trp.end()); 
    cout << "Matrix from triplets:" << endl; 
    cout << A << endl;    

    cout << endl << "Triplets:" << endl; 
    cout << "Row\tCol\tVal" <<endl; 
    for (int k=0; k < A.outerSize(); ++k) 
    { 
     for (SparseMatrix<int>::InnerIterator it(A,k); it; ++it) 
     { 
      cout << 1+it.row() << "\t"; // row index 
      cout << 1+it.col() << "\t"; // col index (here it is equal to k) 
      cout << it.value() << endl; 
     } 
    } 

    return 0; 
} 
+0

谢谢您的答复。但是,这是如何从三重向量制作矩阵。我正在寻找“如何获得已经存在于Eigen格式中的矩阵的三重向量”。 – 2015-02-25 15:13:55

+0

@SinaJ请参阅第二部分。而不是打印它,构建三胞胎。 – 2015-02-25 18:22:46

+0

@SinaJ如果你想访问原始指针,可以通过'm.valuePtr()','m.outerIndexPtr()'和'm.innerIndexPtr()'来访问它们,但它们的长度不一样。不能天真地转换为三胞胎)。 – 2015-02-26 11:59:02