Matlab от Fortran - проблемы с переносом большой матрицы - PullRequest
0 голосов
/ 20 сентября 2018

Мне нужно позвонить Матлабу из Фортрана и выполнить там программу.У меня есть большая матрица данных 3xN (N около 2500), которую нужно перенести в Matlab.Я заметил некоторые расхождения в данных - последняя строка матрицы Фортрана становится первой строкой в ​​Matlab (однако другие строки остаются на своем месте, смещены на 1), и эта строка также теряет первое значение.

Как это - в Фортране

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 голосов
/ 20 сентября 2018

Я использую 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 создан.Затем в Octave:

load DPArray
DPArray

производит вывод:

1   1   1
2   2   2
3   3   3

Я посчитал необходимым перекодировать подпрограмму Write для различных типов переменных (Write_Array_CMPLX, Write_Array_INT) и т. Д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...