创建一个元素类型为结构的特征稀疏矩阵

Create an Eigen sparse matrix with elements type of a struct

我想知道是否有任何方法可以将稀疏矩阵定义为Eigen::SparseMatrix< StructElem >,这意味着矩阵的每个元素都是一个结构。

我尝试了下面的代码,但是我得到了"no suitable constructor exists to convert from int to StructElem"的错误。

// the structure of element:
    struct StructElem
    {
       unsigned int mInd;
       bool mIsValid;
       double mVec[ 4 ];
    };

// define the matrix:    
    Eigen::SparseMatrix< StructElem > lA( m, n);

// work with the matrix
    for( unsigned int i = 0; i < m; i++)
    {
       StructElem lElem;
       lElem.mInd = i;
       lElem.mIsValid = true;
       lElem.mVec= {0.0, 0.1, 0.2, 0.4};

       lA.coeffRef(i, i) = lElem; // got the error here!
    }

我想知道您是否有任何解决此错误的想法?

您不能将 类 或结构存储为 Eigen::SparseMatrix 的系数。 constructor of the Eigen::SparseMatrix 的类型是

Eigen::SparseMatrix< _Scalar, _Options, _StorageIndex >::SparseMatrix ( )   

这意味着Eigen::SparseMatrix只能用于存储标量系数。可以使用的标量类型是任意数值类型,如floatdoubleintstd::complex<float>等,如here所述。

目前尚不清楚为什么要将标量类型以外的任何其他内容存储为 SparseMatrix 的系数,因为稀疏矩阵用于算术运算。但是,如果您真的想通过 SparseMatrix 来寻址结构,您可以准备一个 StructElem 类型的结构数组,并将该数组的索引存储到 Eigen::SparseMatrix<int>.

正如@RHertel 所注意到的,Eigen::SparseMatrix 旨在用于行为类似于标量类型的类型。例如,类型应该可以从 0 构造,并且它应该是可加和可乘的(后者只有在你用它做实际的线性代数时才需要)。

你可以愚弄 Eigen 来处理你的自定义类型,方法是添加一个接受 int(但忽略它)的构造函数:

struct StructElem
{
   unsigned int mInd;
   bool mIsValid;
   std::array<double,4> mVec;
   explicit StructElem(int) {}
   StructElem() = default;
};

完整演示:https://godbolt.org/z/7iPz5U