/*********************************************************************** * mexsmat.c : C mex file * * M = mexsmat(blk,x,isspM,rowidx,colidx,iscellM); * * SDPT3: version 3.0 * Copyright (c) 1997 by * K.C. Toh, M.J. Todd, R.H. Tutuncu * Last Modified: 2 Feb 01 ***********************************************************************/ #include #include /********************************************************** * form Q using the upper triangular part **********************************************************/ void sym(double *Q, int n) { int j, k, jn, kn; for (j=0; jj) {idxj+=j+1;} else {break;}} j2=j; if (i < j) { B[i+j*n] = ir2*A[k]; } else { B[i+j*n] = A[k]; } } } else if (!isspA & isspB) { idx = colidx*mA; count = 0; for (j=0; jj) {idxj+=j+1;} else {break;}} j2=j; irB[count] = i; if (i t2) { t2 = t; jstart = cumblksize[t2]; jend = cumblksize[t2+1]; idxj = blknnz[t2]; j2 = jstart; } for (j=j2; jj) {idxj+=j-jstart+1;} else {break;}} j2=j; irB[count] = i; if (ij) {idxj+=j+1;} else {break;}} j2=j; if (i < j) { ind = i+j*n; B[ind] = ir2*A[k]; BI[ind] = ir2*AI[k]; } else { ind = i+j*n; B[ind] = A[k]; BI[ind] = AI[k];} } } else if (!isspA & isspB) { idx = colidx*mA; count = 0; for (j=0; jj) {idxj+=j+1;} else {break;}} j2=j; irB[count] = i; if (i t2) { t2 = t; jstart = cumblksize[t2]; jend = cumblksize[t2+1]; idxj = blknnz[t2]; j2 = jstart; } for (j=j2; jj) {idxj+=j-jstart+1;} else {break;}} j2=j; irB[count] = i; if (i1){ mexErrMsgTxt("mexsmat: requires 1 output argument."); } /* CHECK THE DIMENSIONS */ iscellA = mxIsCell(prhs[1]); if (iscellA) { mA = mxGetM(prhs[1]); nA = mxGetN(prhs[1]); } else { mA = 1; nA = 1; } if (mxGetM(prhs[0]) != mA) { mexErrMsgTxt("mexsmat: blk and Avec not compatible"); } /***** main body *****/ if (nrhs > 3) {rowidx = (int)*mxGetPr(prhs[3]); } else {rowidx = 1;} if (rowidx > mA) { mexErrMsgTxt("mexsmat: rowidx exceeds size(Avec,1)."); } subs[0] = rowidx-1; /* subtract 1 to adjust for Matlab index */ subs[1] = 1; index = mxCalcSingleSubscript(prhs[0],nsubs,subs); blk_cell_pr = mxGetCell(prhs[0],index); if (blk_cell_pr == NULL) { mexErrMsgTxt("mexsmat: blk not properly specified"); } numblk = mxGetN(blk_cell_pr); blksize = mxGetPr(blk_cell_pr); cumblksize = (int*)mxCalloc(numblk+1,sizeof(int)); blknnz = (int*)mxCalloc(numblk+1,sizeof(int)); cumblksize[0] = 0; blknnz[0] = 0; n = 0; n2 = 0; for (k=0; k 1) { isspB = 1; } else { if (nrhs > 2) {isspB = (int)*mxGetPr(prhs[2]);} else {isspB = isspA;} } if (nrhs > 4) {colidx = (int)*mxGetPr(prhs[4]) -1;} else {colidx = 0;} if (colidx > n1) { mexErrMsgTxt("mexsmat: colidx exceeds size(Avec,2)."); } /***** create return argument *****/ if (isspB) { if (isspA) { NZmax = jcA[colidx+1]-jcA[colidx]; } else { NZmax = blknnz[numblk]; } if (iscmpA) { rhs[0] = mxCreateSparse(n,n,2*NZmax,mxCOMPLEX); } else { rhs[0] = mxCreateSparse(n,n,2*NZmax,mxREAL); } B = mxGetPr(rhs[0]); irB = mxGetIr(rhs[0]); jcB = mxGetJc(rhs[0]); if (iscmpA) { BI = mxGetPi(rhs[0]); } } else { if (iscmpA) { plhs[0] = mxCreateDoubleMatrix(n,n,mxCOMPLEX); } else { plhs[0] = mxCreateDoubleMatrix(n,n,mxREAL); } B = mxGetPr(plhs[0]); if (iscmpA) { BI = mxGetPi(plhs[0]); } } /***** Do the computations in a subroutine *****/ if (iscmpA) { if (numblk == 1) { smat1cmp(n,ir2,A,irA,jcA,isspA,m1,colidx,B,irB,jcB,isspB,AI,BI); } else { smat2cmp(n,numblk,cumblksize,blknnz,ir2,A,irA,jcA,isspA,m1,colidx,B,irB,jcB,isspB,AI,BI); } } else { if (numblk == 1) { smat1(n,ir2,A,irA,jcA,isspA,m1,colidx,B,irB,jcB,isspB); } else { smat2(n,numblk,cumblksize,blknnz,ir2,A,irA,jcA,isspA,m1,colidx,B,irB,jcB,isspB); } } if (isspB) { /*** if isspB, (actual B) = B+B' ****/ mexCallMATLAB(1, &rhs[1], 1, &rhs[0], "ctranspose"); #if defined HAVE_OCTAVE mexCallMATLAB(1, &plhs[0],2, rhs, "plus"); #else mexCallMATLAB(1, &plhs[0],2, rhs, "+"); #endif mxDestroyArray(*rhs); } mxFree(blknnz); mxFree(cumblksize); return; } /**********************************************************/