为特征向量动态分配内存

dynamically allocate memeory for Eigen Vector

我正在使用 Eigen 线性代数库。我努力尝试在 class 的构造函数中分配特征向量,然后调用这些向量的元素。

例如,

#include <Eigen/Dense>
using Eigen::VectorXd;
#include <memory>
using std::unique_ptr;

class Cl
{
public:
    unique_ptr<VectorXd> v;

    Cl(const int n);
    ~Cl(void);
}
Cl::Cl(const int n)
{
    auto v= unique_ptr<VectorXd>(new VectorXd(n));
}
Cl::~Cl(void)
{
    v= nullptr;
}

main(void)
{
    Cl cl(10);

    /* call an element of v how? */

}

例如,使用 "cl.v(2)" 会出现编译错误(我正在使用 clang++)

error: type 'unique_ptr<VectorXd>' (aka 'unique_ptr<Matrix<double, Dynamic, 1> >') does
      not provide a call operator

在使用 "cl.(*v)(2)" 时给我

error: expected unqualified-id
        cout << cl.(*v)(2) << endl;

我是 c++ 的新手,所以我可能会遗漏一些非常基本的东西。

为什么要尝试动态分配 Eigen::VectorXd v; 本身?除非你想延长 v 的生命周期超过 cl 的生命周期(在这种情况下你确实必须这样做),我建议遵循以下简单示例:

#include <Eigen/Dense>
using Eigen::VectorXd;

class Cl
{
public:
   VectorXd v;
    Cl(int n) : v(n) {}
    ~Cl() {}
}

int main()
{
    Cl cl(10);
    for (int i=0; i<10; ++i)
        cl.v(i) = i;
}

我相信除了关于 std::vector 的答案之外,您还滥用了 'unique_ptr',如果您确实需要使用一个(参考 ggael 答案)。请参阅以下有关 unique_ptr:

用法的示例
#include <iostream>
#include <memory>
#include <vector>

class Cl {
    public:
        std::unique_ptr<std::vector<int>> v;
        Cl(const int size, int default_values);
        ~Cl(void);
        int Size();
};

Cl::Cl(const int size, int default_values = 0) {
    v.reset(new std::vector<int>(size, default_values));
}

Cl::~Cl(void) {
    // do not require to reset/destroy an auto_ptr so this can be ommitted 
}

int Cl::Size() {
    return v->size();
}

int main(int argc, char* argv[]) {
    Cl blob(10);
    int size = blob.Size();
    std::cout << size << std::endl;
}

在您提供的代码中,您在构造函数中声明了一个新的 auto,而不是使用您在 Public class 定义中定义的变量。我包含了一个 'Size' 方法,因此您可以看到范围超出了构造函数。