gpt4 book ai didi

c++ - 从 MATLAB diag(sqrt(v)) 转换为 C++ 中的 Eigen

转载 作者:太空狗 更新时间:2023-10-29 21:37:35 27 4
gpt4 key购买 nike

我有以下 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/

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