/********************************************************************** * mextriangsp: given upper triangular U, * options = 1 (default), solves U *y = b (backward substitutions) * = 2 , solves U'*y = b (forward substitutions). * * y = mextriangsp(Uinput,b,options) * * Important: U is assumed to be sparse. * If options = 1, Uinput must be Utranspose. * *********************************************************************/ #include #include /************************************************************* bwsolve2: solve Ux = b for x by backward substitutions. Ut: sparse, Ut = transpose(U) **************************************************************/ void bwsolve2(int n, double *Ut, mwIndex *irUt, mwIndex *jcUt, double *b, double *x) { int j, k, kstart, kend, idx; double tmp; /************************************************ x[j]*Ut[j,j] + x[j+1:n]*Ut[j+1:n,j] = b[j] ************************************************/ x[n-1] = b[n-1]/Ut[jcUt[n]-1]; for (j=n-2; j>=0; j--) { kstart = jcUt[j]+1; kend = jcUt[j+1]; tmp = 0.0; for (k=kstart; k 1) { mexErrMsgTxt("mextriangsp generates 1 output argument."); } n = mxGetM(prhs[0]); if (mxGetN(prhs[0]) != n) { mexErrMsgTxt("mextriangsp: U must be square."); } U = mxGetPr(prhs[0]); isspU = mxIsSparse(prhs[0]); if (!isspU) { mexErrMsgTxt("mextriangsp: U must be sparse"); } else { irU = mxGetIr(prhs[0]); jcU = mxGetJc(prhs[0]); } isspb = mxIsSparse(prhs[1]); if ( mxGetM(prhs[1])*mxGetN(prhs[1]) != n ) { mexErrMsgTxt("mextriangsp: Size of U,b mismatch."); } if (nrhs > 2) { options = (int)*mxGetPr(prhs[2]); } else { options = 1; } if (isspb) { btmp = mxGetPr(prhs[1]); irb = mxGetIr(prhs[1]); jcb = mxGetJc(prhs[1]); b = (double*)mxCalloc(n,sizeof(double)); kend = jcb[1]; for (k=0; k 0) { mexErrMsgTxt("mextriangsp: matrix not upper triangular."); } fwsolve2(n,U,irU,jcU,b,x); } if (isspb) { mxFree(b); } return; } /*************************************************************/