外部インタフェース/API | ![]() ![]() |
FortranアプリケーションからのMATLABの呼び出し
このプログラムfngdemo.f
は、スタンドアロンFortranプログラムからエンジン関数を呼び出す方法を記述しています。
C C C fengdemo.f C C This program illustrates how to call the MATLAB C Engine functions from a Fortran program. C C Copyright (c) 1996-2000 by The MathWorks, Inc. C C=============================================================== C $ Revision: 1.7 $ program main C--------------------------------------------------------------- C (pointer) Replace integer by integer*8 on the DEC Alpha C platform. C integer engOpen, engGetMatrix, mxCreateFull, mxGetPr integer ep, T, D C--------------------------------------------------------------- C C Other variable declarations here double precision time(10), dist(10) integer engPutMatrix, engEvalString, engClose integer temp, status data time / 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 / C ep = engOpen('matlab ') C if (ep .eq. 0) then write(6,*) 'Can''t start MATLAB engine' stop endif C T = mxCreateFull(1, 10, 0) call mxSetName(T, 'T') call mxCopyReal8ToPtr(time, mxGetPr(T), 10) C C C Place the variable T into the MATLAB workspace. C status = engPutMatrix(ep, T) C if (status .ne. 0) then write(6,*) 'engPutMatrix failed' stop endif C C C Evaluate a function of time, distance = (1/2)g.*t.^2 C (g is the acceleration due to gravity) C if (engEvalString(ep, 'D = .5.*(-9.8).*T.^2;') .ne. 0) then write(6,*) 'engEvalString failed' stop endif C C C Plot the result. C if (engEvalString(ep, 'plot(T,D);') .ne. 0) then write(6,*) 'engEvalString failed' stop endif if (engEvalString(ep, 'title(''Position vs. Time'')') .ne. 0) then write(6,*) 'engEvalString failed' stop endif if (engEvalString(ep, 'xlabel(''Time (seconds)'')') .ne. 0) then write(6,*) 'engEvalString failed' stop endif if (engEvalString(ep, 'ylabel(''Position (meters)'')') .ne. 0) then write(6,*) 'engEvalString failed' stop endif C C C Read from console to make sure that we pause long enough to be C able to see the plot. C print *, 'Type 0 <return> to Exit' print *, 'Type 1 <return> to continue' read(*,*) temp C if (temp.eq.0) then print *, 'EXIT!' stop end if C if (engEvalString(ep, 'close;') .ne. 0) then write(6,*) 'engEvalString failed' stop endif C D = engGetMatrix(ep, 'D') call mxCopyPtrToReal8(mxGetPr(D), dist, 10) print *, 'MATLAB computed the following distances:' print *, ' time(s) distance(m)' do 10 i=1,10 print 20, time(i), dist(i) 20 format(' ', G10.3, G10.3) 10 continue C C call mxFreeMatrix(T) call mxFreeMatrix(D) status = engClose(ep) C if (status .ne. 0) then write(6,*) 'engClose failed' stop endif C stop end
プログラムを実行するとMATLABを起動し、データを送信して結果をプロットします。
Type 0 <return> to Exit Type 1 <return> to continue
1 MATLAB computed the following distances: time(s) distance(m) 1.00 -4.90 2.00 -19.6 3.00 -44.1 4.00 -78.4 5.00 -123. 6.00 -176. 7.00 -240. 8.00 -314. 9.00 -397. 10.0 -490.
最後に、プログラムはメモリを開放し、MATLABエンジンをクローズして終了します。
![]() | エンジン関数の呼び出しの例題 | オープンされているMATLABの利用 | ![]() |