/*********************************************************************** * mexmat.c : C mex file * * M = mexmat(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 /********************************************************** * single block (real) **********************************************************/ void mat1(int n, double *A, mwIndex *irA, mwIndex *jcA, int isspA, int mA, int colidx, double *B, mwIndex *irB, mwIndex *jcB, int isspB) { int idx, i, j, r, jn, k, kstart, kend, idxj, j2, count; double tmp; if (!isspA && !isspB) { idx = colidx*mA; for (j=0; j=n) {idxj+=n;} else {break;}} j2=j; B[i+j*n] = A[k]; } } else if (isspA && isspB) { count = 0; j2 = 0; idxj = 0; kstart = jcA[colidx]; kend = jcA[colidx+1]; for (k=kstart; k=n) {idxj+=n;} else {break;}} j2=j; irB[count] = i; B[count] = A[k]; ++jcB[j+1]; count++; } for (j=0; j=n) {idxj+=n;} else {break;}} j2=j; ind = i+j*n; B[ind] = A[k]; BI[ind] = AI[k]; } } else if (isspA && isspB) { count = 0; j2 = 0; idxj = 0; kstart = jcA[colidx]; kend = jcA[colidx+1]; for (k=kstart; k=n) {idxj+=n;} else {break;}} j2=j; irB[count] = i; B[count] = A[k]; BI[count] = AI[k]; ++jcB[j+1]; count++; } for (j=0; j1){ 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); 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 (numblk == 1 && isspA) { NZmax = jcA[colidx+1]-jcA[colidx]; } else { NZmax = blknnz[numblk]; } if (iscmpA) { plhs[0] = mxCreateSparse(n,n,NZmax,mxCOMPLEX); } else { plhs[0] = mxCreateSparse(n,n,NZmax,mxREAL); } B = mxGetPr(plhs[0]); irB = mxGetIr(plhs[0]); jcB = mxGetJc(plhs[0]); if (iscmpA) { BI = mxGetPi(plhs[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 (numblk == 1) { if (iscmpA) { mat1cmp(n,A,irA,jcA,isspA,m1,colidx,B,irB,jcB,isspB,AI,BI); } else { mat1(n,A,irA,jcA,isspA,m1,colidx,B,irB,jcB,isspB); } } else { if (isspA) { Atmp = (double*)mxCalloc(blknnz[numblk],sizeof(double)); kstart = jcA[colidx]; kend = jcA[colidx+1]; for (k=kstart; k1)) { mxFree(Atmp); if (iscmpA) { mxFree(AItmp); } } return; } /**********************************************************/