SUBROUTINE MEXFUNCTION(NLHS, PLHS, NRHS, PRHS) IMPLICIT NONE INTEGER PLHS(*), PRHS(*) INTEGER NLHS, NRHS INTEGER MXCREATEFULL, MXGETPR INTEGER MXGETM, MXGETN 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 ! CALL INTERMEDIATE GATEWAY: CALL GATEWAY(PLHS,PRHS,N(1)) END ! ============================================================== SUBROUTINE GATEWAY(PLHS, PRHS, T) IMPLICIT NONE INTEGER PLHS(2), PRHS(1), T INTEGER MXCREATEFULL, MXGETPR INTEGER MXGETM, MXGETN DOUBLE PRECISION A(T), B(T), C call mxcopyptrtoreal8(mxgetpr(prhs(1)),A,T) call mxcopyptrtoreal8(mxgetpr(prhs(2)),B,T) plhs(1) = mxcreatefull(1,1,0) ! CALL COMPUTATIONAL ROUTINE: CALL VVMULT(A,B,C,T) CALL MXCOPYreal8TOPTR(C,mxgetpr(plhs(1)),1) END ! =============================================================== SUBROUTINE VVMULT(A,B,C,T) IMPLICIT NONE INTEGER T DOUBLE PRECISION A(T), B(T), C INTEGER I C = 0.0D0 DO 100, I=1,T C = C + A(I) * B(I) 100 CONTINUE END