【问题标题】:Armadillo function eig_sym() not working犰狳函数 eig_sym() 不工作
【发布时间】:2014-10-24 10:54:37
【问题描述】:

我正在尝试使用 Armadillo 线性代数库中的函数 eig_sym 来查找方阵的特征值:

mat STRESS = Mat<double>(3, 3, fill::zeros);
vec principals;

/**
   Populate STRESS with symmetric values
   from a stress tensor history named "stressTensor"
**/

STRESS(0,0) = stressTensor[XX].data[0];
STRESS(0,1) = stressTensor[XY].data[0];
STRESS(0,2) = stressTensor[XZ].data[0];
STRESS(1,0) = stressTensor[XY].data[0];
STRESS(1,1) = stressTensor[YY].data[0];
STRESS(1,2) = stressTensor[YZ].data[0];
STRESS(2,0) = stressTensor[XZ].data[0];
STRESS(2,1) = stressTensor[YZ].data[0];
STRESS(2,2) = stressTensor[ZZ].data[0];

eig_sym(principals, STRESS); // Code fails here

我收到 std::logic_error 消息,根据犰狳文档,这意味着矩阵 STRESS 不是方形的,即使它明显是方形的。

我什至运行了 Armadillo Doc 中的示例代码:

// for matrices with real elements

mat A = randu<mat>(50,50);
mat B = A.t()*A;  // generate a symmetric matrix

vec eigval;
mat eigvec;

eig_sym(eigval, eigvec, B);

这也会产生 std::logic_error 消息。

我觉得我错过了一些非常简单的东西,因为我什至无法让示例代码工作。包含目录设置正确,因为我在项目的其他地方使用 arma:: 函数没有问题。

提前感谢您的帮助!

路易斯·瓦兰斯

编辑 24/10/14 @1316GMT: 我认为该错误是由于我没有配置 LAPACK 造成的。我的印象是犰狳带有预编译的 LAPACK 和 openBLAS。如果我只安装了 Armadillo,如何将我的项目配置为与 LAPACK 链接?

【问题讨论】:

  • 查看犰狳附带的 README.txt 文件
  • 你使用的是什么操作系统?

标签: c++ armadillo eigenvalue


【解决方案1】:
  • 更改 armadillo_bits 中的配置文件并取消注释以下行 #define ARMA_USE_LAPACK#define ARMA_USE_BLAS
  • http://ylzhao.blogspot.com.au/2013/10/blas-lapack-precompiled-binaries-for.html此链接将有助于下载 blas 的预编译版本和 LAPACK 库下载发行版 32 位,具体取决于您的 mingW bit 安装
  • 在项目内放置文件夹
  • 转到项目属性> c++ build > mingw c++ 链接器> 在工具设置下设置没有lib扩展名的库的名称
  • 添加库搜索路径并从工作空间选项中选择
  • 将这些库的dll文件放在项目文件夹中

这应该足以运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多