| External Interfaces/API | ![]() |
Calling Functions from Fortran MEX-Files
It's possible to call MATLAB functions, operators, M-files, and even other MEX-files from within your Fortran source code by using the API function mexCallMATLAB. This example creates an mxArray, passes various pointers to a subfunction to acquire data, and calls mexCallMATLAB to calculate the sine function and plot the results.
C $ Revision: 1.8 $
C
================================================================
C
C sincall.f
C
C Example for illustrating how to use mexCallMATLAB.
C
C Creates an mxArray and passes its associated pointers (in
C this demo, only pointer to its real part, pointer to number
C of rows, pointer to number of columns) to subfunction fill()
C to get data filled up, then calls mexCallMATLAB to calculate
C sin function and plot the result.
C
C NOTE: The subfunction fill() is in the file called fill.f.
C
C This is a MEX-file for MATLAB.
C Copyright (c) 1984-2000 The MathWorks, Inc.
C
C ==============================================================
C Gateway subroutine
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
integer nlhs, nrhs
C---------------------------------------------------------------
C (pointer) Replace integer by integer*8 on the DEC Alpha
C platform.
C
integer plhs(*), prhs(*)
integer rhs(1), lhs(1)
integer mxGetPr, mxCreateFull
C---------------------------------------------------------------
C
integer m, n, max
C initializition
m=1
n=1
max=1000
rhs(1) = mxCreateFull(max, 1, 0)
C Pass the pointer and variable and let fill() fill up data.
call fill(%val(mxGetPr(rhs(1))), m, n, max)
call mxSetM(rhs(1), m)
call mxSetN(rhs(1), n)
call mexCallMATLAB(1, lhs, 1, rhs, 'sin')
call mexCallMATLAB(0, NULL, 1, lhs, 'plot')
C Clean up the unfreed memory after calling mexCallMATLAB.
call mxFreeMatrix(rhs(1))
call mxFreeMatrix(lhs(1))
return
end
C $ Revision: 1.3 $
C
================================================================
C
C fill.f
C This is the subfunction called by sincall that fills the
C mxArray with data. Your version of fill can load your data
C however you would like.
C
C This is a MEX-file for MATLAB.
C Copyright (c) 1984-2000 The MathWorks, Inc.
C
C
================================================================
C Subroutine for filling up data.
subroutine fill(pr, m, n, max)
real*8 pr(*)
integer i, m, n, max
m=max/2
n=1
do 10 i=1,m
10 pr(i)=i*(4*3.1415926/max)
return
end
It is possible to use mexCallMATLAB (or any other API routine) from within your computational Fortran subroutine. Note that you can only call most MATLAB functions with double-precision data. M-functions that perform computations, like eig, will not work correctly with data that is not double precision.
sincall
Note
It is possible to generate an object of type mxUNKNOWN_CLASS using mexCallMATLAB. See the example below.
|
The following example creates an M-file that returns two variables but only assigns one of them a value. function [a,b]=foo[c] a=2*c;
MATLAB displays the following warning message.
Warning: One or more output arguments not assigned during call to 'foo'.
If you then call foo using mexCallMATLAB, the unassigned output variable will now be of type mxUNKNOWN_CLASS.
| Handling Sparse Matrices | Advanced Topics | ![]() |