从 Eigen Matrix 继承并从内存构造或映射
Inherit from Eigen Matrix and construct or map from memory
我 运行 很少用 eigen 进行测试(作为我目前使用的增强矩阵的替代品)并且我试图为 [=定义 CTOR 29=]a class 在特征矩阵 之上 我遇到了一段代码的问题,该代码会产生很多噪音 warning。问题显然来自标量类型和标量类型上的指针之间的模板类型的混淆。
欢迎所有帮助或建议,
谢谢。
我定义如下模板class
template<typename T>
class CVector : public Eigen::Matrix<T, Eigen::Dynamic, 1, Eigen::StorageOptions::AutoAlign>
{
public:
typedef typename Eigen::Matrix<T, Eigen::Dynamic, 1, Eigen::StorageOptions::AutoAlign> Base_Vector;
.....
我使用 Eigen 文档提供的一段代码从 Eigen 对象和 3 个构造函数下面的几行构造
CVector(size_t size1) : Base_Vector(size1)
{}
CVector(size_t size1, T val): Base_Vector(size1)
{
this->setConstant(5);
}
CVector(T* val_array, size_t val_array_size): Base_Vector(val_array_size)
{
std::copy(val_array, val_array+val_array_size, this->data());
}
但是最后一个 CTOR 在我尝试通过编写如下内容来使用它时引起了很多警告:
int tab [] = { 1,2,3,4,5 };
CVector<int> v3(tab, 5);
从 VS'2015 我得到:
warning C4267: 'argument': conversion from 'size_t' to 'const int', possible loss of data
note: see reference to class template instantiation 'Eigen::internal::is_convertible_impl<unsigned __int64,int>' being compiled
note: see reference to class template instantiation 'Eigen::internal::is_convertible<std::T,int>' being compiled
with
[
T=std::size_t
]
note: see reference to function template instantiation 'Eigen::Matrix<int,-1,1,0,-1,1>::Matrix<std::size_t>(const T &)' being compiled
with
[
T=std::size_t
]
note: see reference to function template instantiation 'Eigen::Matrix<int,-1,1,0,-1,1>::Matrix<std::size_t>(const T &)' being compiled
with
[
T=std::size_t
]
note: while compiling class template member function 'CVector<int>::CVector(T *,std::size_t)'
with
[
T=int
]
note: see reference to function template instantiation 'CVector<int>::CVector(T *,std::size_t)' being compiled
with
[
T=int
]
note: see reference to class template instantiation 'CVector<int>' being compiled
但另一方面,我使用时完全没有警告
float tab [] = { 1,2,3,4,5 };
CVector<float> v3(tab, 5);
Eigen 使用带符号的类型来存储大小和索引。此类型是 Eigen::Index
,默认情况下是 std::ptr_diff
的类型定义。只需将 size_t
替换为 Eigen::Index
,在执行此操作时,您还可以将构造函数实现替换为这些:
CVector(Eigen::Index size1) : Base_Vector(size1) {}
CVector(Eigen::Index size1, T val)
: Base_Vector(Base_Vector::Constant(size1, val) { }
CVector(T const * val_array, Eigen::Index val_array_size)
: Base_Vector(Base_Vector::Map(val_array, val_array_size) { }
顺便说一句:不知道,为什么 CVector<float> v3(tab, 5);
没有发出与 int
变体相同的警告 ...
我 运行 很少用 eigen 进行测试(作为我目前使用的增强矩阵的替代品)并且我试图为 [=定义 CTOR 29=]a class 在特征矩阵 之上 我遇到了一段代码的问题,该代码会产生很多噪音 warning。问题显然来自标量类型和标量类型上的指针之间的模板类型的混淆。
欢迎所有帮助或建议, 谢谢。
我定义如下模板class
template<typename T>
class CVector : public Eigen::Matrix<T, Eigen::Dynamic, 1, Eigen::StorageOptions::AutoAlign>
{
public:
typedef typename Eigen::Matrix<T, Eigen::Dynamic, 1, Eigen::StorageOptions::AutoAlign> Base_Vector;
.....
我使用 Eigen 文档提供的一段代码从 Eigen 对象和 3 个构造函数下面的几行构造
CVector(size_t size1) : Base_Vector(size1)
{}
CVector(size_t size1, T val): Base_Vector(size1)
{
this->setConstant(5);
}
CVector(T* val_array, size_t val_array_size): Base_Vector(val_array_size)
{
std::copy(val_array, val_array+val_array_size, this->data());
}
但是最后一个 CTOR 在我尝试通过编写如下内容来使用它时引起了很多警告:
int tab [] = { 1,2,3,4,5 };
CVector<int> v3(tab, 5);
从 VS'2015 我得到:
warning C4267: 'argument': conversion from 'size_t' to 'const int', possible loss of data
note: see reference to class template instantiation 'Eigen::internal::is_convertible_impl<unsigned __int64,int>' being compiled
note: see reference to class template instantiation 'Eigen::internal::is_convertible<std::T,int>' being compiled
with
[
T=std::size_t
]
note: see reference to function template instantiation 'Eigen::Matrix<int,-1,1,0,-1,1>::Matrix<std::size_t>(const T &)' being compiled
with
[
T=std::size_t
]
note: see reference to function template instantiation 'Eigen::Matrix<int,-1,1,0,-1,1>::Matrix<std::size_t>(const T &)' being compiled
with
[
T=std::size_t
]
note: while compiling class template member function 'CVector<int>::CVector(T *,std::size_t)'
with
[
T=int
]
note: see reference to function template instantiation 'CVector<int>::CVector(T *,std::size_t)' being compiled
with
[
T=int
]
note: see reference to class template instantiation 'CVector<int>' being compiled
但另一方面,我使用时完全没有警告
float tab [] = { 1,2,3,4,5 };
CVector<float> v3(tab, 5);
Eigen 使用带符号的类型来存储大小和索引。此类型是 Eigen::Index
,默认情况下是 std::ptr_diff
的类型定义。只需将 size_t
替换为 Eigen::Index
,在执行此操作时,您还可以将构造函数实现替换为这些:
CVector(Eigen::Index size1) : Base_Vector(size1) {}
CVector(Eigen::Index size1, T val)
: Base_Vector(Base_Vector::Constant(size1, val) { }
CVector(T const * val_array, Eigen::Index val_array_size)
: Base_Vector(Base_Vector::Map(val_array, val_array_size) { }
顺便说一句:不知道,为什么 CVector<float> v3(tab, 5);
没有发出与 int
变体相同的警告 ...