gpt4 book ai didi

Rcpparmadillo : can't call Fortran routine "dgebal"?

转载 作者:行者123 更新时间:2023-12-01 08:51:22 24 4
gpt4 key购买 nike

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

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

但是,当我尝试使用 sourceCpp() 编译我的代码时我收到以下错误:
error: 'dgebal_' was not declared in this scope

如果我进一步包括 <R_ext/Lapack.h><R_ext/BLAS.h> ,代码编译没有错误并且运行良好。但是编译器会抛出一堆这样的警告:
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 库中?我应该关心这些警告吗?最后,有什么方法可以使用 dgebal在我的 Rcpparmadillo 代码中没有编译警告? Rcpp 和 Rcpparmadillo 都是最新的。操作系统为 Windows 8.1 64 位。

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

#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 : can't call Fortran routine "dgebal"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41094867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com