标签: eigen

在Eigen中访问矩阵的列作为向量

如何从矩阵中访问单个向量?

例如:有没有办法使用类似于返回?A(i)的矩阵来提取矢量?Eigen::MatrixXf A(10,10)Eigen::VectorXf A(10)

c++ eigen

22
推荐指数
1
解决办法
2万
查看次数

解决线性方程组的最有效方法

我有一个(nxn)对称矩阵A和一个(nx 1)向量B.基本上,我只需要解决Ax = b for x.问题是A可能会很大.所以我正在寻找最有效的C++求解线性方程的算法.我查看了Eigen库.显然它有一个SVD方法,但我被告知它很慢.解决x =逆(A)*b似乎也不是最理想的.uBLAS更快吗?有没有更有效的方法?谢谢.

编辑:矩阵A是正定的而不是稀疏的.

c++ matrix linear-algebra eigen

22
推荐指数
1
解决办法
3万
查看次数

在Mac OS X上为XCode安装Eigen

不久之后,我试图让Eigen在我的Mac上运行XCode,这是一场噩梦,但是一位朋友设法弄明白了并与我分享了指示.我不希望任何人经历我所经历的事情,所以这里有一个易于理解的指南.

c++ macos xcode libraries eigen

22
推荐指数
2
解决办法
2万
查看次数

CMake找不到Eigen3

我已将FindEigen3.cmake复制到我的源目录中.

然后我补充说:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

到我的CMakeLists.txt告诉CMake使用这个.cmake文件.

然后在我的CMakeLists.txt中我做:

FIND_PACKAGE(Eigen3)
Run Code Online (Sandbox Code Playgroud)

我将环境变量EIGEN3_INCLUDE_DIR设置为/ home/doriad/src/eigen

当我运行CMake时,我得到:

-- Could NOT find Eigen3 (missing: EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) (Required is at least version "2.91.0")
Run Code Online (Sandbox Code Playgroud)

这是Mercurial的新克隆版,所以版本应该至少为3.

有什么建议?

如果我设置模块路径不正确,我会得到一些线索:

Adjust CMAKE_MODULE_PATH to find FindEigen3.cmake or set Eigen3_DIR to the
directory containing a CMake configuration file for Eigen3. The file will
have one of the following names:

Eigen3Config.cmake
eigen3-config.cmake
Run Code Online (Sandbox Code Playgroud)

但是,我没有在Eigen3的源目录或构建目录中找到这些文件.我试图设置Eigen3_DIR =/home/doriad/src/eigen,但这也不起作用.

思考?

谢谢,

大卫

cmake eigen

21
推荐指数
1
解决办法
2万
查看次数

找到包装Eigen3 for CMake

CMake无法找到我的Eigen3包.我设置了一个名为的环境变量

EIGEN3_INCLUDE_DIR
Run Code Online (Sandbox Code Playgroud)

指向路径在哪里FindEigen3.cmake.

然后在CMakelists.txt我写道:

find_package( Eigen3 REQUIRED )
include_directories( EIGEN3_INCLUDE_DIR )
Run Code Online (Sandbox Code Playgroud)

我得到下一条错误消息:

CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:91 (MESSAGE):
  Could NOT find Eigen3 (missing: EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
  (Required is at least version "2.91.0")
Call Stack (most recent call first):
  C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:252 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindEigen3.cmake:76 (find_package_handle_standard_args)
  test/test_quaternion/CMakeLists.txt:25 (find_package)
Run Code Online (Sandbox Code Playgroud)

关于我遗失或做错的任何想法?

cmake eigen

21
推荐指数
3
解决办法
6万
查看次数

正确使用Eigen :: Ref <>类

当不需要编写模板函数时,Eigen引入了Ref <>类来编写具有Eigen对象作为参数的函数,而不使用不必要的临时对象.人们可以在这里读到这一点.

当进一步搜索互联网时,我使用Ref <>类找到了几个不同的参数声明.在Eigen文档中,它们const Eigen::Ref<const Eigen::MatrixXf>&用于第一个示例中的只读参数.在第二个例子Eigen::Ref<Eigen::MatrixXd>中引入了读写参数,这里BUT const Eigen::Ref<const Eigen::MatrixXd>用于只读参数(无引用).所以我的问题是:

以下声明和我何时使用它有什么区别?`

  1. const Eigen::Ref<const Eigen::MatrixXd>&
  2. const Eigen::Ref<const Eigen::MatrixXd>
  3. const Eigen::Ref<Eigen::MatrixXd>&
  4. const Eigen::Ref<Eigen::MatrixXd>
  5. Eigen::Ref<const Eigen::MatrixXd>&
  6. Eigen::Ref<const Eigen::MatrixXd>
  7. Eigen::Ref<Eigen::MatrixXd>&
  8. Eigen::Ref<Eigen::MatrixXd>

为了完整性,我列出了const使用和参考的每种可能组合.

c++ parameters pass-by-reference eigen eigen3

21
推荐指数
1
解决办法
4478
查看次数

如何查看Eigen C++模板库的版本号?

我添加了几个不同版本的Eigen默认包括Visual C++目录.但是在使用LDLT(Cholesky分解)某些测试数值例子时,我遇到了崩溃问题.

所以我想确定在调试代码时哪个版本实际处于活动状态.

是否有任何功能可以指示当前有效的Eigen版本号?

c++ eigen

21
推荐指数
3
解决办法
2万
查看次数

将函数应用于所有Eigen矩阵元素

我有一个Eigen::MatrixXd,我想通过应用组件功能来修改其所有元素.例如:

MatrixXd m = ...;

for each m[i][j]:
  m[i][j] = exp(m[i][j]);
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个结果?

c++ matrix eigen

19
推荐指数
3
解决办法
7921
查看次数

C++对齐的未来:通过值传递?

阅读Eigen库文档,我注意到某些对象无法通过值传递.C++ 11或计划开发中是否有任何进展可以安全地按价值传递这些对象?

另外,为什么按值返回这些对象没有问题?

c++ memory-alignment eigen c++11

18
推荐指数
2
解决办法
3244
查看次数

用块稀疏矩阵求解大型线性系统

我想解决Ax = b,其中A是一个非常大的正方形正定对称块矩阵和xb是矢量.当我说大的时候我指的是nxn一个n大到的矩阵300,000.

这是一个我想要解决的更小但有代表性的矩阵的例子.

稀疏矩阵

这里是相同的矩阵放大显示它由密集的matricies块组成.

Sparze矩阵放大了

我以前(看到这里,这里,并且在这里)使用了Eigen的Cholesky解算器,它工作得很好,n<10000但与n=300000Cholesky求解器相比太慢了.但是,我没有利用我有块矩阵的事实.显然,存在用于求解稀疏块矩阵的算法(例如,块cholesky分解).

我想特别知道Eigen是否已经使用因子分解或迭代方法对我可以使用的稀疏密集块矩阵进行了优化算法?

你也可以建议其他算法可能是解决我的矩阵的理想选择吗?我的意思是,据我所知,至少对于因子分解发现排列矩阵是NP难以存在很多不同的启发式方法,并且据我所知,人们建立了不同矩阵结构的直觉(例如带状矩阵)以及哪种算法效果最好跟他们.我还没有这种直觉.

我目前正在研究使用共轭梯度法.我自己用C++实现了这个,但仍然没有利用矩阵是一个块矩阵的事实.

//solve A*rk = xk
//Eigen::SparseMatrix<double> A;
//Eigen::VectorXd rk(n);
Eigen::VectorXd pk = rk;

double rsold = rk.dot(rk);
int maxiter = rk.size();
for (int k = 0; k < maxiter; k++) {
    Eigen::VectorXd Ap = A*pk;  
    double ak = rsold /pk.dot(Ap);
    xk += …
Run Code Online (Sandbox Code Playgroud)

c++ matrix linear-algebra eigen

17
推荐指数
1
解决办法
1030
查看次数