SUBROUTINE MEXFUNCTION(NLHS, PLHS, NRHS, PRHS) IMPLICIT NONE INTEGER, PARAMETER :: PTR=4 INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(12) INTEGER(PTR) :: PLHS(*), PRHS(*) INTEGER :: NLHS, NRHS INTEGER(PTR) :: MXCREATEFULL INTEGER :: MXGETM, MXGETN ! THIS INTERFACE BLOCK WOULD CONFLICT WITH THE DECLARATIONS ! IN MODULE MATLAB_API interface function mxgetpr(pm) integer, pointer :: mxgetpr integer :: pm end function mxgetpr end interface INTEGER(PTR), POINTER :: PTR_IN_1, PTR_IN_2, PTR_OUT integer M(2), N(2) IF (NRHS .NE. 2) THEN CALL MEXERRMSGTXT('TIMES requires two input arguments') ELSEIF (NLHS .GT. 1) THEN CALL MEXERRMSGTXT('TIMES requires one output argument') END IF M(1) = MXGETM(PRHS(1)) N(1) = MXGETN(PRHS(1)) M(2) = MXGETM(PRHS(2)) N(2) = MXGETN(PRHS(2)) IF (N(1) .NE. M(2)) THEN CALL MEXERRMSGTXT('INPUT DIMENSION MISMATCH') END IF IF (M(1) .NE. 1) THEN CALL MEXERRMSGTXT('FIRST ARGUMENT IS NOT A ROW VECTOR') END IF IF (N(2) .NE. 1) THEN CALL MEXERRMSGTXT('SECOND ARGUMENT IS NOT A COLUMN VECTOR') END IF PTR_IN_1 => mxgetpr(prhs(1)) PTR_IN_2 => mxgetpr(prhs(2)) plhs(1) = mxcreatefull(1,1,0) PTR_OUT => mxgetpr(plhs(1)) ! CALL COMPUTATIONAL ROUTINE: CALL VVMULT(PTR_IN_1,PTR_IN_2,PTR_OUT,N(1)) END SUBROUTINE MEXFUNCTION ! ==================================================================== ! NOTE THAT THE DIMENSIONS OF THE POINTERS MUST BE EXPLICITLY DECLARED ! AND THE SUBROUTINE CANNOT BE 'CONTAIN'ED IN THE CALLING ROUTINE ! ==================================================================== SUBROUTINE VVMULT(A,B,C,T) IMPLICIT NONE INTEGER :: T REAL(8), INTENT(IN) :: A(T), B(T) REAL(8), INTENT(OUT) :: C C=SUM(A*B) END SUBROUTINE VVMULT