我正在探索将一些Fortran代码实现到R中。作为一个简单的例子,我想创建一个简单的Fortran文件来转置R矩阵。我知道.Fortran
只会返回提交给它的参数。考虑到这一点,我想避免发送一个空白矩阵来容纳新值,因为我希望将一些Fortran扩展到一些非常大的矩阵,这可能会导致R的开销增加(如果我是这样,请纠正我。这里错了)。因此,我试图转置提交的矩阵并将其作为相同的参数返回。我已成功在Fortran代码中获取所需的输出,但无法在R中正确返回。您将在下面看到print语句返回相应的形状数组,但数组返回为' A'仍然是不正确的。我最初怀疑分配数组的东西,但是当我尝试实现时R不断崩溃。任何见解都将不胜感激。
test.f90
subroutine trans(A,n,m)
implicit none
integer, intent(in) :: n,m
double precision, intent(inout) :: A(n,m)
! declare local array to hold transpose
double precision :: B(m,n)
! do the transpose
B = transpose(A)
! try to reshape and reassign A
A = reshape(A, shape(B))
print*,A
end
编译R使用
R CMD SHLIB test.f90
R代码
# or trans.so if on unix
dyn.load("test.dll")
# create simple matrix
set.seed(123)
a <- matrix(rnorm(15), 3, 5)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] -0.5604756 0.07050839 0.4609162 -0.4456620 0.4007715
[2,] -0.2301775 0.12928774 -1.2650612 1.2240818 0.1106827
[3,] 1.5587083 1.71506499 -0.6868529 0.3598138 -0.5558411
# call fortran function
.Fortran("trans", a, as.integer(3), as.integer(5))
#output
>.Fortran("trans", a, as.integer(3), as.integer(5))
-0.56047565 -0.2301775 1.5587083
0.07050839 0.1292877 1.7150650
0.46091621 -1.2650612 -0.6868529
-0.44566197 1.2240818 0.3598138
0.40077145 0.1106827 -0.5558411
[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] -0.5604756 0.07050839 0.4609162 -0.4456620 0.4007715
[2,] -0.2301775 0.12928774 -1.2650612 1.2240818 0.1106827
[3,] 1.5587083 1.71506499 -0.6868529 0.3598138 -0.5558411
[[2]]
[1] 3
[[3]]
[1] 5
答案 0 :(得分:1)
.Fortran
在列表中返回其输出,其组件与其参数相同。所以你想做
a <- .Fortran("trans", a, 3L, 5L)[[1]]