为特征向量动态分配内存
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' 方法,因此您可以看到范围超出了构造函数。
我正在使用 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' 方法,因此您可以看到范围超出了构造函数。