我有以下 MATLAB 片段,我想用 C++ 将它翻译成 Eigen:
>> v=[1; 2; 3]
v =
1
2
3
>> m=diag(sqrt(v))
m =
Diagonal Matrix
1.0000 0 0
0 1.4142 0
0 0 1.7321
我的 C++ 代码如下:
#include <iostream>
#include "Eigen/Dense"
int main()
{
Eigen::Matrix< double, 3, 1> v;
v << 1,2,3;
std::cout << v << "\n";
Eigen::Matrix< double, 3, 1> v2 = v.array().sqrt();
Eigen::Matrix< double, 3, 3> m = v2.asDiagonal();
std::cout << m << "\n";
return 0;
}
输出是:
1
2
3
1 0 0
0 1.41421 0
0 0 1.73205
所以它有效,但我不太喜欢它,因为我更喜欢类似的东西
#include <iostream>
#include "Eigen/Dense"
int main()
{
Eigen::Matrix< double, 3, 1> v;
v << 1,2,3;
std::cout << v << "\n";
Eigen::Matrix< double, 3, 3> m = v.array().sqrt().asDiagonal();
std::cout << m << "\n";
return 0;
}
没有编译给出这个错误:
/home/aj/projects/test_eigen/test_eigen.cpp: In function ‘int main()’:
/home/aj/projects/test_eigen/test_eigen.cpp:10:52: error: ‘const class Eigen::CwiseUnaryOp<Eigen::internal::scalar_sqrt_op<double>, const Eigen::ArrayWrapper<Eigen::Matrix<double, 3, 1> > >’ has no member named ‘asDiagonal’
Eigen::Matrix< double, 3, 3> m = v.array().sqrt().asDiagonal();
^
CMakeFiles/test_eigen.dir/build.make:62: recipe for target 'CMakeFiles/test_eigen.dir/test_eigen.cpp.o' failed
make[2]: *** [CMakeFiles/test_eigen.dir/test_eigen.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/test_eigen.dir/all' failed
make[1]: *** [CMakeFiles/test_eigen.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
我可以得到一条线
#include <iostream>
#include "Eigen/Dense"
int main()
{
Eigen::Matrix< double, 3, 1> v;
v << 1,2,3;
std::cout << v << "\n";
Eigen::Matrix< double, 3, 3> m = Eigen::Matrix< double, 3, 1>(v.array().sqrt()).asDiagonal();
std::cout << m << "\n";
return 0;
}
但在我看来,我仍然遗漏了一些东西,或者我不完全理解如何使用 Eigen 正确编写代码...
最佳答案
下面应该可以工作,注意 .matrix()
从 ArrayWrapper 转换回 Matrix :
#include <iostream>
#include "Eigen/Dense"
int main()
{
Eigen::Matrix< double, 3, 1> v ;
v << 1, 2, 3;
Eigen::Matrix< double, 3, 3> m = v.array().sqrt().matrix().asDiagonal());
std::cout << m << "\n";
return 0;
}
关于c++ - 从 MATLAB diag(sqrt(v)) 转换为 C++ 中的 Eigen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37195056/