如何调整 std::vector of Eigen::MatrixXd 的大小
How to resize a std::vector of Eigen::MatrixXd
我需要在我的程序中使用特征矩阵向量。矢量的大小是已知的。但是向量的每个成员对应的矩阵大小可以有不同的大小,需要动态分配。基于 https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html 我想我可以将我的矩阵声明为
#define EIGEN_USE_MKL_ALL
#define EIGEN_USE_LAPACKE
// Additional libraries
#include <iomanip>
#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include "Eigen/Core"
#include "Eigen/LU"
#include "Eigen/StdVector"
int A = 4;
int B = 5;
std::vector<Eigen::MatrixXd > inv_K_mat2(A,B);
这导致在编译过程中出现以下错误
error C2664: 'std::vector<Eigen::MatrixXd,std::allocator<_Ty>>::vector(std::vector<_Ty,std::allocator<_Ty>> &&,const _Alloc &) noexcept(<expr>)': cannot convert argument 2 from 'int' to 'const _Alloc &'
1> with
1> [
1> _Ty=Eigen::MatrixXd,
1> _Alloc=std::allocator<Eigen::MatrixXd>
1> ]
1> and
1> [
1> _Alloc=std::allocator<Eigen::MatrixXd>
1> ]
1>e:\users\pkuma\work\edem_flex_tire\edem-deformable-tire-develop\compiler\pme_flextire_interface.cpp(107): note: Reason: cannot convert from 'int' to 'const _Alloc'
1> with
1> [
1> _Alloc=std::allocator<Eigen::MatrixXd>
1> ]
如果我将声明更改为
,则编译成功
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2;
是否有不同的方法来初始化可以动态分配大小的特征矩阵向量?
为什么会出现此错误?
让我们看看您的代码:
std::vector<Eigen::MatrixXd> inv_K_mat2(A,B);
您正在尝试构造一个 std::vector
事物(在本例中为动态大小的特征矩阵)。但是没有 constructor to std::vector
接受两个整数作为参数。构造函数的某些版本(上面 link 中的版本 (3) 和 (4))将整数作为第一个参数——向量的初始大小——以及可选的第二个参数。
在版本 (3) 中,第二个参数是 const T&
类型,即向量中包含的类型:在我们的例子中是 MatrixXd
。您可以将整数 B
转换为 const MatrixXd&
吗?不,所以编译器会查看另一个候选者:构造函数版本 (4)。
编译器假定第二个参数必须是一个分配器。您可以将 int
转换为分配器吗?不,这是一个问题,这就是您收到的错误消息的含义:
cannot convert argument 2 from 'int' to 'const _Alloc &'
为什么你的第二个版本有效?
现在让我们来看看下一个版本:
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2;
在这种情况下,这是不同的。您正在构造一个不同类型的向量 T
(这次是固定大小的 4×5 本征矩阵),构造函数没有参数:上面 link 中的版本 (1)。这非常好,编译器很高兴。
请注意,在这种情况下,您构建的向量开始时为空(它包含 0 个矩阵)。如果你想构造一个初始化为包含 42 个固定大小矩阵的向量,你可以这样做
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2(42);
这里我们再次使用带有整数参数的构造函数版本 (3)。我们的向量从 42 个固定大小为 4×5 的矩阵开始。请注意,当然 none 的矩阵元素已初始化。但是我们的好朋友构造函数 (3) 允许我们提供类型为 const T&
的参数作为所有元素的初始值。所以这给了我们类似的东西:
std::vector<Eigen::Matrix<double, 4, 5>> inv_K_mat2(42, Eigen::Matrix<double, 4, 5>::Zero());
这将初始化一个由 42 个固定大小的 4×5 矩阵组成的向量,全部设置为值 Eigen::Matrix<double, 4, 5>::Zero()
(即 0 初始化的固定大小 4×5 矩阵)。
我们如何让它适用于动态矩阵?
我们将使用与此处固定大小矩阵相同的策略。关键区别在于,对于 MatrixXd
,我们需要在 MatrixXd
的构造函数中指定大小。因此,我们将再次调用 std::vector
构造函数 (3),将我们的初始大小作为第一个参数,并将大小为 4 和 5 的新构造的 MatrixXd
作为第二个参数。
std::vector<Eigen::MatrixXd> inv_K_mat2(42, Eigen::MatrixXd(4, 5));
或者,如果您想将所有矩阵初始化为 0,可以使用 MatrixXd
' 零函数,它允许您构造一个任意给定大小的零矩阵作为参数:
std::vector<Eigen::MatrixXd> inv_K_mat2(42, Eigen::MatrixXd::Zero(4, 5));
我需要在我的程序中使用特征矩阵向量。矢量的大小是已知的。但是向量的每个成员对应的矩阵大小可以有不同的大小,需要动态分配。基于 https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html 我想我可以将我的矩阵声明为
#define EIGEN_USE_MKL_ALL
#define EIGEN_USE_LAPACKE
// Additional libraries
#include <iomanip>
#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include "Eigen/Core"
#include "Eigen/LU"
#include "Eigen/StdVector"
int A = 4;
int B = 5;
std::vector<Eigen::MatrixXd > inv_K_mat2(A,B);
这导致在编译过程中出现以下错误
error C2664: 'std::vector<Eigen::MatrixXd,std::allocator<_Ty>>::vector(std::vector<_Ty,std::allocator<_Ty>> &&,const _Alloc &) noexcept(<expr>)': cannot convert argument 2 from 'int' to 'const _Alloc &'
1> with
1> [
1> _Ty=Eigen::MatrixXd,
1> _Alloc=std::allocator<Eigen::MatrixXd>
1> ]
1> and
1> [
1> _Alloc=std::allocator<Eigen::MatrixXd>
1> ]
1>e:\users\pkuma\work\edem_flex_tire\edem-deformable-tire-develop\compiler\pme_flextire_interface.cpp(107): note: Reason: cannot convert from 'int' to 'const _Alloc'
1> with
1> [
1> _Alloc=std::allocator<Eigen::MatrixXd>
1> ]
如果我将声明更改为
,则编译成功std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2;
是否有不同的方法来初始化可以动态分配大小的特征矩阵向量?
为什么会出现此错误?
让我们看看您的代码:
std::vector<Eigen::MatrixXd> inv_K_mat2(A,B);
您正在尝试构造一个 std::vector
事物(在本例中为动态大小的特征矩阵)。但是没有 constructor to std::vector
接受两个整数作为参数。构造函数的某些版本(上面 link 中的版本 (3) 和 (4))将整数作为第一个参数——向量的初始大小——以及可选的第二个参数。
在版本 (3) 中,第二个参数是 const T&
类型,即向量中包含的类型:在我们的例子中是 MatrixXd
。您可以将整数 B
转换为 const MatrixXd&
吗?不,所以编译器会查看另一个候选者:构造函数版本 (4)。
编译器假定第二个参数必须是一个分配器。您可以将 int
转换为分配器吗?不,这是一个问题,这就是您收到的错误消息的含义:
cannot convert argument 2 from 'int' to 'const _Alloc &'
为什么你的第二个版本有效?
现在让我们来看看下一个版本:
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2;
在这种情况下,这是不同的。您正在构造一个不同类型的向量 T
(这次是固定大小的 4×5 本征矩阵),构造函数没有参数:上面 link 中的版本 (1)。这非常好,编译器很高兴。
请注意,在这种情况下,您构建的向量开始时为空(它包含 0 个矩阵)。如果你想构造一个初始化为包含 42 个固定大小矩阵的向量,你可以这样做
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2(42);
这里我们再次使用带有整数参数的构造函数版本 (3)。我们的向量从 42 个固定大小为 4×5 的矩阵开始。请注意,当然 none 的矩阵元素已初始化。但是我们的好朋友构造函数 (3) 允许我们提供类型为 const T&
的参数作为所有元素的初始值。所以这给了我们类似的东西:
std::vector<Eigen::Matrix<double, 4, 5>> inv_K_mat2(42, Eigen::Matrix<double, 4, 5>::Zero());
这将初始化一个由 42 个固定大小的 4×5 矩阵组成的向量,全部设置为值 Eigen::Matrix<double, 4, 5>::Zero()
(即 0 初始化的固定大小 4×5 矩阵)。
我们如何让它适用于动态矩阵?
我们将使用与此处固定大小矩阵相同的策略。关键区别在于,对于 MatrixXd
,我们需要在 MatrixXd
的构造函数中指定大小。因此,我们将再次调用 std::vector
构造函数 (3),将我们的初始大小作为第一个参数,并将大小为 4 和 5 的新构造的 MatrixXd
作为第二个参数。
std::vector<Eigen::MatrixXd> inv_K_mat2(42, Eigen::MatrixXd(4, 5));
或者,如果您想将所有矩阵初始化为 0,可以使用 MatrixXd
' 零函数,它允许您构造一个任意给定大小的零矩阵作为参数:
std::vector<Eigen::MatrixXd> inv_K_mat2(42, Eigen::MatrixXd::Zero(4, 5));