conservativeResize(),对于新值,值为零

问题描述 投票:6回答:3

在调整矩阵大小后如何将新值设置为零?确实很奇怪,在调整矩阵大小之后,将新值设置为垃圾值,而不是至少设置为零。

N = 0;
Eigen::MatrixXd CO;
CO.setZero(3+3*N, 3+3*N);
std::cout << CO << std::endl << std::endl;
Nt = 1;
CO.conservativeResize(3+3*Nt,3+3*Nt);
std::cout << CO << std::endl << std::endl;

结果

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9pSkh5RC5qcGcifQ==” alt =“在此处输入图像描述”>

c++ eigen3
3个回答
7
投票

我已经使用conservativeResizeLike()解决了问题

int Nt = 0;
Eigen::MatrixXd  CO;
CO.setOnes(3+3*Nt, 3+3*Nt);
std::cout << CO << std::endl << std::endl;
Nt = 1;
CO.conservativeResizeLike(Eigen::MatrixXd::Zero(3+3*Nt,3+3*Nt));
std::cout << CO << std::endl << std::endl;

结果

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9TT1RyVC5qcGcifQ==” alt =“在此处输入图像描述”>

而且,我发现您可以将它们设置为Eigen::MatrixXd::Ones(3+3*Nt,3+3*Nt)或标识Eigen::MatrixXd::Identity(3+3*Nt,3+3*Nt)

对于身份

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9seTR0NC5qcGcifQ==” alt =“在此处输入图像说明”>


3
投票

那些值不是“垃圾”值,而是“未初始化的内存”值。您有责任将它们设置为对您有意义的任何值。如果需要,遍历新值并将它们归零并不难。


0
投票

我不确定您正在使用哪个版本的Eigen。但是直到今天,Eigen都​​有一个setZero()函数,该函数将该表达式中的所有系数设置为零。

这里是文档:Derived & Eigen::DenseBase< Derived >::setZero ( )

© www.soinside.com 2019 - 2024. All rights reserved.