我正致力于为一些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 ++接口是我的真正目标。