如何使用Eigen,这是一个用于线性代数的C++模板库?

6
我有一个使用矩阵的图像处理算法,我拥有自己的矩阵操作代码(乘法、逆运算等)。但是我使用的处理器是ARM Cortex-A8处理器,它具有用于向量化的NEON协处理器,由于矩阵操作是SIMD操作的理想情况,所以我要求编译器(-mfpu = neon -mfloat-abi = softfp)为我的代码生成NEON指令,但编译器未能这样做,然后我还尝试编写自己的NEON内部代码进行矩阵操作,但我发现这很难做到。
因此,我考虑利用承诺向量化矩阵操作的Eigen库。所以我立即下载了Eigen C++库,并尝试按照他们的教程使用它,但不幸的是,当我运行他们的示例程序时,我遇到了编译错误
有没有人有使用Eigen的经验,任何示例都会非常有帮助?请帮助我如何解决这个问题。
帮帮忙!
谢谢

我将Eigen文件夹放在/home/ubuntu/Documents/eigen路径下,并在Eclipse的C++项目中设置了该路径为附加目录。然后我运行以下程序(示例)-

#include <Eigen/Core>

// import most common Eigen types
USING_PART_OF_NAMESPACE_EIGEN

int main(int, char *[])
{
  Matrix3f m3;
  m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
  Matrix4f m4 = Matrix4f::Identity();
  Vector4i v4(1, 2, 3, 4);

  std::cout << "m3\n" << m3 << "\nm4:\n"
    << m4 << "\nv4:\n" << v4 << std::endl;
}

我收到的错误信息 -

项目Test_Eigen的配置Debug构建 ****

make all

正在构建文件:../main.cpp

调用:Sourcery G++ C++编译器

arm-none-linux-gnueabi-g++ -I/home/ubuntu/Documents/eigen -O0 -g3 -Wall -c -fmessage-length=0 -fcommon -MMD -MP -MF"main.d" -MT"main.d" -mcpu=cortex-a8 -marm -o"main.o"

"../main.cpp"

../main.cpp:6: 错误: 在 'int' 之前预期构造函数、析构函数或类型转换 make: *** [main.o] 错误 1


如果您不发布特定的错误信息,我们将无法帮助您。 - Thomas
1
编译错误是什么? - Cogwheel
你有检查编译器是否支持和链接的依赖关系吗? - Praveen S
抱歉各位,我刚刚编辑了问题,请再次查看问题。谢谢。 - HaggarTheHorrible
为什么这被标记为与C相关? - nmichaels
Nathon,抱歉,我会修复它。 - HaggarTheHorrible
2个回答

11

USING_PART_OF_NAMESPACE_EIGEN 宏在 Eigen 3 中被移除。相反,只需使用

using namespace Eigen;

显然这个教程已经过时了。


是的,Thomas,教程确实过时了。现在它可以正常工作了。感谢您的快速回复,节省了很多时间。 - HaggarTheHorrible

2

我正在使用Ubuntu 17.04,以下是我的工作步骤:
首先:我从eigen官网下载了egien3.3.3压缩包,并解压到一个名为eigen的目录中,然后进入该目录。
其次:逐个运行以下命令或将它们制作成xxx.sh文件一次性运行。

#!/bin/bash
#eigen3 install
#from: http://eigen.tuxfamily.org/index.php?title=Main_Page
#download the package like eigen-eigen-67e894c6cd8f.tar.gz 

mkdir build
cd build
cmake -DEIGEN_TEST_NO_OPENGL=1 .. 
make 
sudo make install

最后:
进行测试
#include <eigen3/Eigen/Core>
#include <iostream>

// import most common Eigen types
//USING_PART_OF_NAMESPACE_EIGEN
using namespace Eigen;
using namespace std;
int main(int, char *[])
{
  Matrix3f m3;
  m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
  Matrix4f m4 = Matrix4f::Identity();
  Vector4i v4(1, 2, 3, 4);

  cout << "m3\n" << m3 << "\nm4:\n"
    << m4 << "\nv4:\n" << v4 << endl;
}

注意:
要找到您安装的结果,请查看 /usr/local/include/eigen3/
如果有任何更改,请参见 mytinx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接