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

标签 c++ matlab matrix eigen

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

相关文章:

c++ - 为什么这段代码有效,发生的事情的名称是什么?

c++ - 按第一个值降序排列一组对,然后按第二个值的字母顺序排列

c++ - 带有边界数字的算法设计 : Best Way to Represent a 2D Grid,,用 C++ 编写?

java - Matlab:使用 spmd 中的第三方 java 类

javascript - 有效地转置javascript数组

c - 为结构设置值对我不起作用。 (C)

c++ - 访问 std::string 中的空终止符(字符串下标超出范围)

r - MATLAB 中 R 对应项中的 "Sapply"函数,用于将代码从 R 转换为 MATLAB

arrays - 从没有循环的两个数组元素成对创建数组

c - 获取矩阵中周围元素的总和