/*********************************************************************** * mexblkeig: find the eigenvalues of a symmetric block diagonal matrix * * d = mexblkeig(blk,A); * * SDPT3: version 3.0 * Copyright (c) 1997 by * K.C. Toh, M.J. Todd, R.H. Tutuncu * Last Modified: 2 Feb 01 ***********************************************************************/ #include #include #include #include /* needed for memcpy() */ #if !defined(MX_API_VER) || ( MX_API_VER < 0x07030000 ) typedef int mwIndex; typedef int mwSize; #endif #if !defined(MAX) #define MAX(A, B) ((A) > (B) ? (A) : (B)) #endif #if !defined(r2) #define r2 1.41421356237309504880 /* sqrt(2) */ #endif #if !defined(ir2) #define ir2 0.70710678118654752440 /* 1/sqrt(2) */ #endif /********************************************************** * ***********************************************************/ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { mxArray *blk_cell_pr; mxArray *tmparr[1]; double *A, *blksizetmp, *P, *V, *D, *eigP; double *work, *work2; mwIndex *irA, *jcA, *irV, *jcV, *irD, *jcD; int *blksize, *cumblksize, *cumblksize2; int isspA; char *jobz="V"; char *uplo="U"; mwIndex subs[2]; mwSize nsubs=2; mwSize lwork, lwork2, info; int m, n, n2, nsub, k, index, numblk, len, maxblksize; int i, j, l, jn, idxstart, idxend, kstart, kend, idx, count; int blklen, blklen2, rowidx, colidx, kn; /* CHECK FOR PROPER NUMBER OF ARGUMENTS */ if (nrhs < 2){ mexErrMsgTxt("mexblkeig: requires 2 input arguments."); } if (nlhs > 2){ mexErrMsgTxt("mexblkeig: requires at 2 output arguments."); } /* CHECK THE DIMENSIONS */ if (mxGetM(prhs[0]) > 1) { mexErrMsgTxt("mexblkeig: blk can only have 1 row."); } if (mxGetN(prhs[0]) < 2) { mexErrMsgTxt("mexblkeig: blk must have at least 2 columns."); } subs[0] = 0; subs[1] = 1; index = mxCalcSingleSubscript(prhs[0],nsubs,subs); blk_cell_pr = mxGetCell(prhs[0],index); numblk = mxGetN(blk_cell_pr); blksizetmp = mxGetPr(blk_cell_pr); blksize = mxCalloc(numblk,sizeof(int)); for (k=0; k