Arrays Fortran返回整形数组?

Arrays Fortran返回整形数组?,arrays,r,fortran,Arrays,R,Fortran,我正在探索一些Fortran代码在R中的实现。作为一个简单的例子,我想创建一个简单的Fortran文件来转换R矩阵。我知道,.Fortran只会返回提交给它的参数。考虑到这一点,我希望避免发送空白矩阵来容纳新值,因为我希望将一些Fortran扩展到一些非常大的矩阵,这可能会增加R的开销(如果我在这里出错,请纠正我)。因此,我尝试转置提交的矩阵,并将其作为相同的参数返回。我成功地在Fortran代码中获得了所需的输出,但无法在R中正确返回。您将在下面看到,print语句返回了适当的形状数组,但返回

我正在探索一些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
#或trans.so(如果在unix上)
动态加载(“test.dll”)
#创建简单的矩阵
种子集(123)
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
#调用fortran函数
.Fortran(“trans”,a,as.integer(3),as.integer(5))
#输出
>.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

.Fortran
以列表的形式返回其输出,其组件与其参数相同。那么你想做什么

a <- .Fortran("trans", a, 3L, 5L)[[1]]

a转置在我看来是正确的。你在期待什么?@HongOoi,是的,转置是正确的,但这只是打印出来的,我目前没有捕获它的方法。很抱歉,我不够清楚,我编辑了上面的代码,以显示返回的参数与原始矩阵相同。fortran中的print语句使我能够看到转置已正常工作。我希望打印输出替换原始的
a
矩阵。只是确认一下,提交的矩阵
a
在经过Fortran处理后,是否无法使其尺寸有所不同?我对捕获“打印”并不感兴趣,而是想获取打印出来的内容,并将其作为
.Fortran(“trans”,…)[[1]]