c++ - 如何在类中初始化Eigen的SparseMatrix

标签 c++ eigen

我正在尝试初始化 Eigen 的 sparseMatrix,但是当初始化在类描述中时它不起作用。在函数中而不是在类中初始化的情况下,它有效。 我正在用 C++ 编写代码并使用 Visual Studio 2017。 我加了 民众: EIGEN_MAKE_ALIGNED_OPERATOR_NEW ,但问题依旧。

#include <iostream>
#include <vector>
#include <Eigen/SparseCore>
#include <Eigen/Sparse>
#include "pch.h"

using namespace Eigen;
namespace A {
    class A 
    {
        std::size_t max_doc_id = 4;
        std::size_t max_term_id = 4;
        SparseMatrix<float, Eigen::RowMajor, int64_t> smat(max_term_id, max_doc_id); 
    public:
        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    };

我想决定smat matrix (col=4, row=4) 的大小,但是报错信息是这样的(实际上是日文写的所以可能不正确) “成员 A::A::max_term_id 不是类型的名称。” 如果你能帮助我,我将不胜感激。

最佳答案

编译器认为您声明的是成员函数而不是成员变量(有关初始化的更多信息,请参阅 here)。下面编译。我正在使用 Index 而不是 size_t 来消除一些警告(缩小转换)。您可以在此处使用代码:https://godbolt.org/z/yV1NUL

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

using namespace Eigen;
namespace A {
    class A 
    {
        Index max_doc_id = 4;
        Index max_term_id = 4;
        SparseMatrix<float, Eigen::RowMajor, int64_t> smat{max_term_id, max_doc_id}; 
    public:
        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    };

}

注意:您不应该在头文件中使用using namespace,参见"using namespace" in c++ headers

编辑:另请考虑用户@ggael 在评论中所说的内容,很可能您不需要EIGEN_MAKE_ALIGNED_OPERATOR_NEW,因为SparseMatrix 不是fixed-size vectorizable

关于c++ - 如何在类中初始化Eigen的SparseMatrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57543699/

相关文章:

c++ - C++ 中的 Eigen MatrixXd 推回

c++ - 使用可变函数作为模板参数

c++ - 这是列表初始化还是值初始化?

c++ - 从基调用派生类的虚函数导致 "not a member"错误

c++ - 包括时区的 chrono 解析

c++ - 用 block 稀疏矩阵求解大型线性系统

c++ - 使用 unordered_map 分配器的非默认构造函数

c++ - 使用 Eigen 库的编译错误

c++ - 访问矩阵的列作为特征中的 vector

c++ - 使用Eigen::Transpose <const Matrix3>的正确方法?