0

MATLAB プログラムを Fortran に変換する作業を行っています (MATLAB の機能の一部を利用しながら)。IMSL で利用可能なルーチンを利用しようとしています。非線形方程式ソルバー neqnf を提供しますが、サブルーチンがいつ呼び出されるかによって変化する変数を渡す方法を理解できませんでした (たとえば、MATLAB の fsolve でできるように)。たとえば、以下は、neqnf を呼び出す Fortran で記述された MATLAB の mexFunction です。サブルーチン sub には、解くべき連立方程式が含まれています。2 つの線形方程式の係数と切片の変数を neqnf から sub に渡すにはどうすればよいですか?

ありがとう!

#include "fintrf.h"
#include "link_fnl_shared.h"
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
    ! Declarations
    use NEQNF_INT
    implicit none
    external sub

    ! mexFunction arguments
    mwPointer plhs(*), prhs(*)
    integer*4 nlhs, nrhs

    ! mex declarations
    mwpointer mxGetPr,mxCreateNumericArray
    integer*4 mxClassIDFromClassName 

    ! Internal variables
    integer*4 myclassid

    ! Output variables
    mwpointer :: f_pr,x_pr
    double precision :: f(2),x(2)

    ! Create return arguments and assign pointers
    myclassid = mxClassIDFromClassName('double')
    plhs(1) = mxCreateNumericArray(1,2,myclassid,0)
    plhs(2) = mxCreateNumericArray(1,2,myclassid,0)
    f_pr = mxGetPr(plhs(1))
    x_pr = mxGetPr(plhs(2))

    ! Test nonlinear solver (Math.pdf, pg. 1238)
    call d_neqnf(sub,x)

    ! Assign output
    call mxCopyReal8toPtr(f,f_pr,2)
    call mxCopyReal8toPtr(x,x_pr,2)

end subroutine mexFunction

! Subroutine
subroutine sub(x,f,n)
    mwSize n
    double precision :: x(n) ! input
    double precision :: f(n) ! output
    f(1) = 2.d0*x(1) + 1
    f(2) = -1.d0*x(2) + 4
end subroutine sub
4

1 に答える 1

0

変数をサブに取得するには、モジュールを使用していくつかの変数を宣言し、サブルーチンとメインルーチンでモジュールを「使用」します。そうすれば、メイン ルーチンで変数を変更 (または matlab から変数を取得) し、サブでそれらにアクセスできます。

なぜfortranに変換するのですか?実行速度?

また、この種の変換を頻繁に行う場合は、ファイル交換で matlab2fmex を試すことを検討してください。数値の matlab コードを fortran に変換するという忙しい作業の多くを実行できます。

于 2013-05-30T10:47:59.643 に答える