⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mexqops.c

📁 斯坦福大学Grant和Boyd教授等开发的凸优化matlab工具箱
💻 C
字号:
/************************************************************************ mexqops.c : C mex file **   z = mexqops(blk,x,y,options);**   Input: blk   = [n1, n2, ... nk]*          x = n-vector or k-vector*          y = n-vector, where n = n1+...+nk*  *   options = 1, z = k-vector, z(i) = <xi,yi> *           = 2, z = k-vector, z(i) = 2*xi(1)yi(1) - <xi,yi>*           = 3, z = n-vector, zi   = x(i)*yi *           = 4, z = n-vector, zi   = x(i)*yi, zi(1) = -zi(1). ** SDPT3: version 3.0* Copyright (c) 1997 by* K.C. Toh, M.J. Todd, R.H. Tutuncu* Last Modified: 2 Feb 01   ***********************************************************************/#include <mex.h>#include <math.h>#include <matrix.h>#if !defined(MX_API_VER) || ( MX_API_VER < 0x07030000 )typedef int mwIndex;typedef int mwSize;#endif/*********************************************************** ops1 **********************************************************/void ops1(double *x, double *y, double *z,           int numblk, int *cumblk, int options) {  int  j, l, jstart, jend;   double tmp;       if (options == 1) {       for (l=0; l<numblk; ++l) {            jstart = cumblk[l]; jend = cumblk[l+1];          tmp = 0;           for (j=jstart; j<jend; ++j) { tmp += x[j]*y[j]; }          z[l] = tmp;       }   }   else if (options == 2) {       for (l=0; l<numblk; ++l) {            jstart = cumblk[l]; jend = cumblk[l+1];          tmp = x[jstart]*y[jstart];           for (j=jstart+1; j<jend; ++j) { tmp -= x[j]*y[j]; }          z[l] = tmp;      }             }   return;}/*********************************************************** ops3 **********************************************************/void ops3(double *x, double *y, double *z,           int numblk, int *cumblk, int options) {  int  j, l, jstart, jend;   double tmp;      if (options == 3) {      for (l=0; l<numblk; ++l) {           jstart = cumblk[l]; jend = cumblk[l+1];         tmp = x[l];         for (j=jstart; j<jend; ++j) {              z[j] = tmp*y[j]; }      }   }   else if (options == 4) {       for (l=0; l<numblk; ++l) {           jstart = cumblk[l]; jend = cumblk[l+1];         tmp = x[l];         for (j=jstart; j<jend; ++j) {              z[j] = tmp*y[j]; }         z[jstart] = -z[jstart];      }   }   return;}/*********************************************************** ***********************************************************/void mexFunction(int nlhs, mxArray  *plhs[],                  int nrhs, const mxArray  *prhs[] ){    double   *blksize, *x, *y, *z, *xtmp, *ytmp;      mwIndex  *irx, *jcx, *iry, *jcy;      int      *cumblk;     int   mblk, options;      int   l, n, k, r, numblk, cols;/* CHECK FOR PROPER NUMBER OF ARGUMENTS */   if (nrhs !=4){      mexErrMsgTxt("mexqops: requires 4 input arguments."); }   if (nlhs > 1){       mexErrMsgTxt("mexqops: requires 1 output argument."); }/* CHECK THE DIMENSIONS */        numblk = mxGetN(prhs[0]);     blksize = mxGetPr(prhs[0]);    cumblk = mxCalloc(numblk+1,sizeof(int));     for (l=0; l<numblk; l++) {         cols = (int)blksize[l];         cumblk[l+1] = cumblk[l] + cols;      }     n = cumblk[numblk];     /***** assign pointers *****/    options = (int)*mxGetPr(prhs[3]);     if (mxGetM(prhs[2]) != n) {       mexErrMsgTxt("mexqops: dim not compatible.");  }    if (options < 3 & mxGetM(prhs[1]) != n) {               mexErrMsgTxt("mexqops: dim not compatible.."); }                if (options >= 3 & mxGetM(prhs[1]) != numblk) {        mexErrMsgTxt("mexqops: dim not compatible..."); }        if (mxIsSparse(prhs[1])) {        irx = mxGetIr(prhs[1]);  jcx = mxGetJc(prhs[1]); xtmp = mxGetPr(prhs[1]);        x = mxCalloc(n,sizeof(double));        for (k=0; k<jcx[1]; ++k) { r=irx[k]; x[r]=xtmp[k]; } }    else {        x = mxGetPr(prhs[1]);        }        if (mxIsSparse(prhs[2])) {        iry = mxGetIr(prhs[2]);  jcy = mxGetJc(prhs[2]); ytmp = mxGetPr(prhs[2]);        y = mxCalloc(n,sizeof(double));        for (k=0; k<jcy[1]; ++k) { r=iry[k]; y[r]=ytmp[k]; }  }    else {        y = mxGetPr(prhs[2]);     }    /***** Do the computations in a subroutine *****/    if (options < 3) {               plhs[0] = mxCreateDoubleMatrix(numblk,1,mxREAL);       z = mxGetPr(plhs[0]);       ops1(x,y,z,numblk,cumblk,options);     }    else if (options >= 3) {        plhs[0] = mxCreateDoubleMatrix(n,1,mxREAL);       z = mxGetPr(plhs[0]);       ops3(x,y,z,numblk,cumblk,options); } return; }/**********************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -