gpt4 book ai didi

Fortran 的 Matlab - 传输大矩阵的问题

转载 作者:行者123 更新时间:2023-12-02 09:22:48 25 4
gpt4 key购买 nike

我必须从 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。作为警告,这里是我使用的示例,用于 double 二维数组:

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_Array_CMPLX、Write_Array_INT)等重新编码 Write 子例程...

关于Fortran 的 Matlab - 传输大矩阵的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52414297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com