matlab - 来自 Fortran 的 Matlab - 传输大矩阵的问题
问题描述
我必须从 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)
解决方案
我使用 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 子例程......
推荐阅读
- julia - 使用 counts() 的向量或列表中的频率
- javascript - 如何在Javascript中打印奇数和偶数
- python - Google Drive API 问题,KeyError:“client_secret”
- ios - SwiftUI - ListView 中的继承对象(并绑定到选择)
- linux - 在哪里可以找到有关 openssh/sftp-server 协议的文档?
- pytorch - pic 应该是 PIL Image 或 ndarray。得到
- bitlocker - 加密驱动器的 BitLocker 元数据无效 (0x80310010)
- python - 无法将大小为 153600 的数组重塑为 (392, 392)
- python - 在自身内部嵌套一个函数(我很绝望)
- python - Django get_or_create 如何在 foriegnkey 上使用它?