本文介绍了Rcpparmadillo:不能调用 Fortran 例程“dgebal"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用名为 dgebal 的 Fortran 例程(文档 这里) 在我的 Rcpparmadillo 代码中.我包含了以下标题:

I need to use a Fortran routine called dgebal (documentation here) in my Rcpparmadillo code. I have included the following headers:

# include <RcppArmadillo.h>
# include <math.h>

但是,当我尝试使用 sourceCpp() 编译我的代码时,出现以下错误:

However, when I try to compile my code using sourceCpp() I get the following error:

error: 'dgebal_' was not declared in this scope

如果我进一步包含 ,代码编译没有错误并且运行良好.但是编译器会抛出一堆这样的警告:

If I further include <R_ext/Lapack.h> and <R_ext/BLAS.h>, the code compiles without error and runs fine. However the compiler throws a bunch of warnings like this:

C:/PROGRA~1/R/R-32~1.3/include/R_ext/BLAS.h:49:64: warning: declaration of 'double dasum_(const int*, const double*, const int*)' with C language linkage [enabled by default]
C:/PROGRA~1/R/R-32~1.3/library/RCPPAR~1/include/armadillo_bits/def_blas.hpp:76:1: warning: conflicts with previous declaration 'double arma::dasum_(arma::blas_int*, const double*, arma::blas_int*)' [enabled by default]

还有更多类似的警告.我是否正确地假设这是由 Rcpparmadillo 附带的 LAPACK 库不包括 dgebal 引起的,但它包含在 R 的 LAPACK 库中?我应该关心这些警告吗?最后,有没有什么方法可以在我的 Rcpparmadillo 代码中使用 dgebal 而没有编译警告?Rcpp 和 Rcpparmadillo 都是最新的.操作系统为 Windows 8.1 64 位.

There are many more warnings similar to this. Am I correct to assume this is caused by the LAPACK library shipped with Rcpparmadillo not including dgebal, which is however included with R's LAPACK library? Should I be concerned with these warnings? And finally, is there any way to use dgebal in my Rcpparmadillo code without compilation warnings? Both Rcpp and Rcpparmadillo are up to date. Operating system is Windows 8.1 64bit.

感谢 @coatless 和 @Dirk Eddelbuettel 指出这不是 Rcpparmadillo 问题.尽管如此,我的问题仍然存在,我想就如何解决这个问题提出建议.下面是说明我的问题的工作示例代码.它编译得很好,但产生了很多上述警告,这似乎不会影响预期的功能,至少根据我有限的测试.如果我删除两个头文件 R_ext/Lapack.hR_ext/BLAS.h,编译器会抛出上述错误.

Thanks @coatless and @Dirk Eddelbuettel for pointing out that this is not an Rcpparmadillo issue. Nevertheless my problem persists and I would like suggestions on how to get around this. Below is a working example code illustrating my problem. It compiles fine but produces a lot of the aforementioned warnings, which does not seem to affect the intended functionality, at least according to my limited testing. If I remove the two headers R_ext/Lapack.h and R_ext/BLAS.h, the compiler throws the aforementioned error.

#include <RcppArmadillo.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <R.h>
#include <Rinternals.h>
#include <Rmath.h>
#include <R_ext/Lapack.h>
#include <R_ext/BLAS.h>


// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;

// [[Rcpp::export]]
List R_dgebal2(SEXP x)
{
  SEXP dims, z, Scale, i_1, i_2;
  int n, info;

  dims = Rf_getAttrib(x, R_DimSymbol);
  n = INTEGER(dims)[0];


  z = Rf_duplicate(x); Scale = Rf_allocVector(REALSXP, n);
  i_1 = Rf_allocVector(INTSXP, 1); i_2 = Rf_allocVector(INTSXP, 1);

  F77_CALL(dgebal)("B", &n, REAL(z), &n, INTEGER(i_1), INTEGER(i_2),
           REAL(Scale), &info);

  arma::mat zz = as<arma::mat>(wrap(z));
  arma::vec scale2 = as<arma::vec>(wrap(Scale));
  int i1=as<int>(wrap(i_1)), i2=as<int>(wrap(i_2));
  return List::create(_["z"]=zz, _["scale"]=scale2, _["i1"]=i1, _["i2"]=i2);

}

// Test in R
/*** R
Q <- matrix(c(-1.918206e-01,5.999147e-01,0.000000e+00,0.000000e+00,0.000000e+00,1.106148e-01,
              -1.152574e+00,5.716490e-01,0.000000e+00,0.000000e+00,0.000000e+00,5.526595e-01,
              -1.256864e+00,3.905685e+04,0.000000e+00,0.000000e+00,0.000000e+00,1.929101e-01,
              -3.905721e+04,0.000000e+00,8.120577e-02,0.000000e+00,4.923053e-01,3.572873e-01,0.000000e+00),
              nrow = 5, byrow = T)
R_dgebal2(Q)
*/

推荐答案

我已经想通了.我刚刚使用以下几行创建了一个本地头文件,并将其 #included 在我的 .cpp 文件中.编译正常,没有警告或错误.

I have figured this out. I just created a local header file with the following lines and #included it in my .cpp file. Compiles fine with no warnings or errors.

#ifdef ARMA_USE_LAPACK

#if !defined(ARMA_BLAS_CAPITALS)

 #define arma_dgebal dgebal

#else
 #define arma_dgebal DGEBAL

#endif

extern "C"
void arma_fortran(arma_dgebal)(char* job, int* n, double* a, int* lda,
                  int* ilo, int* ihi, double* scale, int* info);

#endif

这篇关于Rcpparmadillo:不能调用 Fortran 例程“dgebal"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 02:00