首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调整Eigen::MatrixXd的std::vector的大小

如何调整Eigen::MatrixXd的std::vector的大小
EN

Stack Overflow用户
提问于 2020-07-06 22:46:25
回答 1查看 345关注 0票数 0

我需要在我的程序中使用特征矩阵的向量。矢量的大小是已知的。然而,对应于向量的每个成员的矩阵大小可以具有不同的大小,并且需要动态分配。基于https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html,我想我可以将我的矩阵声明为

代码语言:javascript
复制
#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);

这会在编译过程中导致以下错误

代码语言:javascript
复制
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>        ]

如果我将声明更改为

代码语言:javascript
复制
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2;

有没有不同的方法来初始化特征矩阵的向量,其中大小可以动态分配?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-07 07:44:30

为什么会出现这个错误?

让我们来看看你的代码:

代码语言:javascript
复制
std::vector<Eigen::MatrixXd> inv_K_mat2(A,B);

您正在尝试构建一个事物的std::vector (在本例中,是动态调整大小的特征矩阵)。但是没有将两个整数作为参数的constructor to std::vector。有一些版本的构造函数(上面链接中的版本(3)和(4) )接受一个整数作为第一个参数--向量的初始大小--以及一个可选的第二个参数。

在版本(3)中,第二个参数的类型是const T&,也就是包含在向量中的类型:在我们的例子中,它是MatrixXd。你能把整数B转换成const MatrixXd&吗?不是的。因此,编译器会考虑另一个候选:构造函数版本(4)。

编译器假定第二个参数必须是分配器。你能把一个int转换成一个分配器吗?不是的。这是一个问题,这是您收到的错误消息的含义:

代码语言:javascript
复制
cannot convert argument 2 from 'int' to 'const _Alloc &'

为什么你的第二个版本可以工作?

现在让我们看一下下一个版本:

代码语言:javascript
复制
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2;

在这种情况下,这是不同的。您正在构造一个不同类型的向量(这一次,是一个固定大小的4×5特征矩阵),没有向构造函数提供参数:上面链接中的T (1)。这是非常好的,编译器也很高兴。

请注意,在这种情况下,您构造的向量从空开始(它包含0个矩阵)。如果你想构造一个初始的向量,比如包含42个固定大小的矩阵,你可以这样做

代码语言:javascript
复制
std::vector<Eigen::Matrix<double, 4, 5 > > inv_K_mat2(42);

在这里,我们再次使用带整数参数的构造函数版本(3)。我们的向量从42个固定大小为4×5的矩阵开始。注意,当然没有一个矩阵的元素是初始化的。但是我们的好朋友构造函数(3)允许我们提供一个const T&类型的参数作为所有元素的初始值。所以这给了我们一些类似的东西:

代码语言:javascript
复制
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作为第二个参数。

代码语言:javascript
复制
std::vector<Eigen::MatrixXd> inv_K_mat2(42, Eigen::MatrixXd(4, 5));

或者,如果您希望将所有矩阵初始化为0,则可以使用MatrixXd的zero函数,该函数允许您构造任意给定大小的零矩阵作为参数:

代码语言:javascript
复制
std::vector<Eigen::MatrixXd> inv_K_mat2(42, Eigen::MatrixXd::Zero(4, 5));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62758570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档