Fortran的Matlab-传输大型矩阵时遇到问题

时间:2018-09-19 21:14:09

标签: matlab fortran

我必须从Fortran调用Matlab并在那里执行程序。我有一个大型3xN(N约为2500)数据矩阵,需要将其传输到Matlab。我注意到数据中存在一些差异-Fortran矩阵的最后一行成为Matlab中的第一行(但是其他行仍然停留在它们的位置,向下移动了1),并且该行也失去了第一个值。

赞-在Fortran中

1.1 1.2 1.3
2.1 2.2 2.3
.....
1999.1 1999.2 1999.3
2000.1 2000.2 2000.3 

在Matlab中成为

0.0 2000.2 2000.3
1.1 1.2 1.3
2.1 2.2 2.3
.....
1999.1 1999.2 1999.3

我无法理解到底出了什么问题。花了几个小时...

node_xyz_ini = mxCreateDoubleMatrix(M, N, 0) ! M, N - dimensions
call mxCopyReal8ToPtr(CoordSet, mxGetPr(node_xyz_ini), M*N)

1 个答案:

答案 0 :(得分:0)

我使用Octave而不是matlab。请注意,这是我使用的一个示例,用于双精度二维数组:

MODULE IO
  use, intrinsic :: iso_c_binding
  !! use c_float,c_double, c_double_complex, c_int,c_ptr
  implicit none
  real (c_double), allocatable :: x(:,:),h(:),f(:)
  integer (c_int),allocatable :: t(:,:)
  integer (c_int) :: nx,ne
contains


  Subroutine Write_Array_RDP(varname,variable)
    implicit none
    integer (c_int) :: kx,ky,sh(2),ncol,nrow
    character(len=7),intent(in) :: varname
    character(:),allocatable :: wrtfmt
    character(range(ncol)) :: res
    real(c_double),intent(in) :: variable(:,:)
    open(unit=10,file=varname,form="formatted",status="replace",action="write")
    write(10,fmt="(A)")"# created by ?? "
    sh=shape(variable)
    ncol=sh(2);nrow=sh(1)
    write(10,fmt="(A,A)")"# name: ",varname
    write(10,fmt="(A)")"# type: matrix"
    write(10,fmt="(A,i0)")"# rows: ",nrow
    write(10,fmt="(A,i0)")"# columns: ",ncol
    write(res,'(i0)') ncol
    wrtfmt="("//trim(res)//"(e20.12))"
    do ky=1,nrow
       write(10,fmt=wrtfmt)(variable(ky,kx),kx=1,ncol)
    end do
    write(10,*)" "
    write(10,*)" "
    close(10)
  End Subroutine Write_Array_RDP

END MODULE IO

Program Main
  use IO
  implicit none
  real (c_double),allocatable :: DPArray(:,:)
  allocate(DPArray(3,3))
DPArray=reshape((/1.0d0,2.0d0,3.0d0,1.0d0,2.0d0,3.0d0,1.0d0,2.0d0,3.0d0/),(/3,3/))
  Call Write_Array_RDP('DPArray',DPArray)
End Program Main

我编译并链接“ gfortran name.f90”,然后使用./a.out运行。文件DPArray已创建。然后在八度:

load DPArray
DPArray

产生输出:

1   1   1
2   2   2
3   3   3

我发现有必要为不同的变量类型(Write_Array_CMPLX,Write_Array_INT)等重新编写Write子例程。