Eigen::Vector;在函数中用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
Eigen::Vector; Initialize Vector with Values of Eigen::Matrix3f in a function, bigger than 4 entries
我有兴趣构建一个 1x6 向量,我想将其与另一个 1x6 向量连接成一个 2x6 矩阵。我知道它将是一个行向量,因此我考虑过初始化一个 Eigen::RowVectorXf vec,但也许一个简单的 Eigen::VectorXf 就足够了,idk.
(进一步,这应该连接到一个更大的 2Nx6 矩阵,用于 SVD 操作)
我的输入是 Eigen::Matrix3f Mat
类型的 3x3 矩阵
我想到了使用一个函数,因为我总共有大约 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 矩阵中并执行 SelfAdjointEigendecomposition 而不是 SVD(可能使用双精度而不是单精度然后)。
Eigen::Matrix<double, 6, 6> VtV; VtV.setZero();
for(int i=0; i<views; ++i) {
foo = ...;
VtV.selfadjointView<Upper>().rankUpdate(foo);
}
我有兴趣构建一个 1x6 向量,我想将其与另一个 1x6 向量连接成一个 2x6 矩阵。我知道它将是一个行向量,因此我考虑过初始化一个 Eigen::RowVectorXf vec,但也许一个简单的 Eigen::VectorXf 就足够了,idk.
(进一步,这应该连接到一个更大的 2Nx6 矩阵,用于 SVD 操作)
我的输入是 Eigen::Matrix3f Mat
类型的 3x3 矩阵我想到了使用一个函数,因为我总共有大约 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 矩阵中并执行 SelfAdjointEigendecomposition 而不是 SVD(可能使用双精度而不是单精度然后)。
Eigen::Matrix<double, 6, 6> VtV; VtV.setZero();
for(int i=0; i<views; ++i) {
foo = ...;
VtV.selfadjointView<Upper>().rankUpdate(foo);
}