External Interfaces/API |
Dynamically Allocating Memory
It is possible to allocate memory dynamically in a Fortran MEX-file, but you must use %val
to do it. This example takes an input matrix of real data and doubles each of its elements.
C============================================================== = C dblmat.f C Example for illustrating how to use %val. C Doubles the input matrix. The demo only handles real part C of input. C C NOTE: If your Fortran compiler does not support %val, C use mxCopy_routine. C NOTE: The subroutine compute() is in the file called C compute.f. C C This is a MEX-file for MATLAB. C Copyright (c) 1984-2000 The MathWorks, Inc. C $Revision: 1.9 $ C============================================================== = C The gateway subroutine subroutine mexfunction(nlhs, plhs, nrhs, prhs) C-------------------------------------------------------------- - C (pointer) Replace integer by integer*8 on the DEC Alpha C 64-bit platform integer plhs(*), prhs(*) integer pr_in, pr_out integer mxGetPr, mxCreateDoubleMatrix C-------------------------------------------------------------- - integer nlhs, nrhs, mxGetM, mxGetN integer m_in, n_in, size if(nrhs .ne. 1) then call mexErrMsgTxt('One input required.') endif if(nlhs .gt. 1) then call mexErrMsgTxt('Less than one output required.') endif m_in = mxGetM(prhs(1)) n_in = mxGetN(prhs(1)) size = m_in * n_in pr_in = mxGetPr(prhs(1)) plhs(1) = mxCreateDoubleMatrix(m_in, n_in, 0) pr_out = mxGetPr(plhs(1)) C Call the computational routine. call compute(%val(pr_out), %val(pr_in), size) return end
This is the subroutine that dblmat
calls to double the input matrix.
C============================================================== = C compute.f C C This subroutine doubles the input matrix. Your version of C compute() may do whaveter you would like it to do. C C This is a MEX-file for MATLAB. C Copyright (c) 1984-2000 The MathWorks, Inc. C $Revision: 1.9 $ C============================================================== = C Computational subroutine subroutine compute(out_mat, in_mat, size) integer size, i real*8 out_mat(*), in_mat(*) do 10 i=1,size out_mat(i) = 2*in_mat(i) 10 continue return end
Note
The dblmat.f example, as well as fulltosparse.f and sincall.f , are split into two parts, the gateway and the computational subroutine, because of restrictions in some compilers.
|
Handling Complex Data | Handling Sparse Matrices |