创建一个元素类型为结构的特征稀疏矩阵
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
只能用于存储标量系数。可以使用的标量类型是任意数值类型,如float
、double
、int
或std::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;
};
我想知道是否有任何方法可以将稀疏矩阵定义为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
只能用于存储标量系数。可以使用的标量类型是任意数值类型,如float
、double
、int
或std::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;
};