在Fortran中更新Rcpp :: NumericMatrix

时间:2017-03-10 15:33:57

标签: r fortran rcpp

我正致力于为一些R分析连接一些现有的Fortran代码。作为前驱,我想创建一个测试函数来确认如何将矩阵传入和传出函数。

根据答案here我认为我可以使用Rcpp通过NumericMatrix方法将.begin()指针传递给C函数。

fortran_test.f

   subroutine test(matrix, M, N)

   IMPLICIT NONE

   integer, intent(in)  ::  M,N
   double precision, intent(inout)   ::  matrix(M,N)
   integer   ::  i,j

   do 10 i=1,M
     do 20 j=1,N
         matrix(i,j) = 2.0D0
 20   end do
 10 end do

    end

cpp_test.cpp

#include <Rcpp.h>

extern "C"
{
    void test_(double *, int, int);
}

using namespace Rcpp;

//' @export
// [[Rcpp::export]]
SEXP cpp_test(NumericMatrix X){

    int nr = X.nrow();
    int nc = X.ncol();

    test_(X.begin(), nr, nc);

    Rcpp::Rcout << X << std::endl;

    return X;
}

然而,当我尝试:

mydata <- matrix(rnorm(16), 4, 4)
cpp_test(mydata)

程序崩溃了。

奇怪的是,如果我尝试使用.Fortran接口(我试图避免,因为我想在Fortran调用之前再做一些C ++),该函数不会崩溃,但矩阵不会更新。我通过Fortran中的一些Print语句确认内部matrix对象正在更新,但它没有返回这些更改。

我在这里缺少什么?

修改

我已经注意到.Fortran调用确实返回了包含更新矩阵的列表。然而,我宁愿进行“就地”修改,但如果可行,我现在不会。最初描述的C ++接口是我的真正目标。

0 个答案:

没有答案