/*********************************************************************** * mexinprod.c : C mex file to compute inner product of 2 vectors, * * Ax = mexinprod(blk,Avec,x,k,p); * where Ax = Avec{p}(:,1:k)'*x * * SDPT3: version 3.0 * Copyright (c) 1997 by * K.C. Toh, M.J. Todd, R.H. Tutuncu * Last Modified: 2 Feb 01 ************************************************************************/ #include #include /********************************************************** * realdot1: x dense, y dense **********************************************************/ double realdot1(const double *x, const int col, const double *y, const int n) { int i, idx; double r; idx=col*n; r=0.0; for (i=0; i2) { mexErrMsgTxt("mexinprod: requires 1 output argument"); } if (nrhs > 4) { rowidx = (int)*mxGetPr(prhs[4]); } else { rowidx = 1; } if (rowidx > mA) { mexErrMsgTxt("mexinprod: rowidx exceeds size(Avec,1)"); } /***** assign pointers *****/ iscellB = mxIsCell(prhs[2]); isspB = mxIsSparse(prhs[2]); m2 = mxGetM(prhs[2]); n2 = mxGetN(prhs[2]); if ((n2 > 1) || (iscellB)) { mexErrMsgTxt("mexinprod: 3RD input must be a column vector"); } if (isspB) { irB = mxGetIr(prhs[2]); jcB = mxGetJc(prhs[2]); Btmp = mxGetPr(prhs[2]); /***** copy Btmp to B *****/ B = (double*)mxCalloc(m2,sizeof(double)); kstart = jcB[0]; kend = jcB[1]; for (k=kstart; k 3) { colidx = (int)*mxGetPr(prhs[3]); } else { colidx = 1; } if (colidx > n1) { mexErrMsgTxt("mexinprod: colidx exceeds size(Avec,2)"); } if (m1 != m2) { mexErrMsgTxt("mexinprod: 2ND and 3RD input not compatible."); } /***** create return argument *****/ plhs[0] = mxCreateDoubleMatrix(colidx,1,mxREAL); tr = mxGetPr(plhs[0]); /***** compute *****/ if (isspA) { for (j=0; j