struct Cholesky{ Int n; MatDoub el; Cholesky(MatDoub_I &a) : n(a.nrows()), el(a) { Int i,j,k; Doub sum; if (el.ncols() != n) throw("need square matrix"); for (i=0;i=0;k--) sum -= el[i][k]*el[j][k]; if (i == j) { if (sum <= 0.0) throw("Cholesky failed"); el[i][i]=sqrt(sum); } else el[j][i]=sum/el[i][i]; } } for (i=0;i=0;k--) sum -= el[i][k]*x[k]; x[i]=sum/el[i][i]; } for (i=n-1;i>=0;i--) { for (sum=x[i],k=i+1;k=j;k--) sum -= el[i][k]*ainv[j][k]; ainv[j][i]= sum/el[i][i]; } for (i=n-1;i>=0;i--) for (j=0;j<=i;j++){ sum = (i