gpt4 book ai didi

c++ - Eigen::vector ;在函数中使用 Eigen::Matrix3f 的值初始化 vector ,大于 4 个条目

转载 作者:行者123 更新时间:2023-11-28 04:34:27 25 4
gpt4 key购买 nike

我有兴趣构建一个 1x6 vector ,我想将其与另一个 1x6 vector 连接成一个 2x6 矩阵。我知道它将是一个行 vector ,因此我考虑过初始化一个 Eigen::RowVectorXf vec,但也许一个简单的 Eigen::VectorXf 就足够了,idk。

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

我的输入是 Eigen::Matrix3f Mat 类型的 3x3 矩阵

我想到了使用一个函数,因为我总共有大约 20 个(数量并不重要)输入矩阵,对于每个我必须以这种方式构建 2 个 vector (是的,这将是一个 40x6 矩阵最后):

问题:

我如何用 ma​​t 的条目初始化 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(除非滥用它)。只需分配一个足够大的矩阵并设置单独的 block :

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 矩阵中并进行 SelfAdjointEigendecomposition 而不是 SVD(然后可能使用 double 而不是单精度)。

Eigen::Matrix<double, 6, 6> VtV; VtV.setZero();

for(int i=0; i<views; ++i) {
foo = ...;
VtV.selfadjointView<Upper>().rankUpdate(foo);
}

关于c++ - Eigen::vector ;在函数中使用 Eigen::Matrix3f 的值初始化 vector ,大于 4 个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51882266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com