特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目

Eigen::Vector; Initialize Vector with Values of Eigen::Matrix3f in a function, bigger than 4 entries

本文关键字:向量 初始化 大于 Eigen 函数 特征 Matrix3f      更新时间:2023-10-16

im 有兴趣建立一个 1x6 向量,我想将其与另一个 1x6 向量连接到 2x6 矩阵。我知道这将是一个行向量,因此我想初始化一个 Eigen::RowVectorXf vec,但也许一个简单的Eigen::VectorXf就足够了,idk。

(进一步,这应该连接到一个更大的2Nx6矩阵,用于SVD操作(

我的输入是特征类型的 3x3 矩阵::矩阵3f 垫

我想使用一个函数,因为我总共有 ~20 个(数字不是那么重要(输入矩阵,对于每个矩阵,我必须以这种方式构建 2 个向量(是的,最终这将是一个 40x6 矩阵(:

问题:

如何使用mat条目初始化vec,特别是如果它不仅是条目,而且是条目的乘积或条目的乘积总和。

例:

// Inputvalue Mat, which i have
Eigen::Matrix<float, 3, 3> mat = [ 1 2 3; 4 5 6; 7 8 9];
// Outputvalue vec, which i need
Eigen::RowVectorXf = ( mat(0,0)*mat(1,1), mat(1,2)*mat(2,1)+mat(1,0)*mat(0,1), .... );

我的 mat(col,row( 输入是任意的,但我有一个col,row的模式,我想测试它,因此我想建立这些向量。我已经在 MATLAB 中完成了,但我有兴趣在 C++ 中使用 Eigen 来做。

RowVectorXf build_Vec(Eigen::Matrix3f Mat)
{
Eigen::RowVectorCf vec = ( ..., ..., ..., ..., ..., ...;);
return vec;
}

有人给我一些提示吗? 提前致谢

为了在运行时动态填充大矩阵,你不能使用 CommaInitializer(不滥用它(。只需分配一个足够大的矩阵并设置单独的块:

Matrix<float, Dynamic, 6> Vges(2*views, 6);
for(int i=0; i<views; ++i) {
Matrix<float, 2, 6> foo;
foo << 1,2,3,4,5,6,7,8,9,10,11,12; // or combine from two Matrix<float, 1, 6>
Vges.middleRows<2>(2*i) = foo;
}

您也可以考虑即时计算Vges.transpose() * Vges(即,通过将foo.transpose()*foo累积到6x6矩阵中,并进行自伴随特征分解而不是SVD(也许使用双精度而不是单精度(。

Eigen::Matrix<double, 6, 6> VtV; VtV.setZero();
for(int i=0; i<views; ++i) {
foo = ...;
VtV.selfadjointView<Upper>().rankUpdate(foo);
}