#include "mex.h" #if 1 /* Minka version, from Golub and van Loan. * Does not use blocking, hence not as efficient as the BLAS routine. */ int dtrsm(char *side, char *uplo, char *transa, char *diag, int *m, int *n, double *alpha, double *a, int *lda, double *b, int *ldb) { int i,j,k; #define A(I,J) a[(I) + (J)*(*lda)] #define B(I,J) b[(I) + (J)*(*ldb)] if(*uplo == 'U') { /* Alg 3.1.4 on p90 */ for(j=0;j<*n;j++) { for(k=*m-1;k>=0;k--) { if(B(k,j) != 0.) { B(k,j) /= A(k,k); for(i=0;i= 1; --k) { if (B(k,j) != 0.) { printf("%d %d %g %g\n",k,j,B(k,j),A(k,k)); B(k,j) /= A(k,k); for (i = 1; i <= k-1; ++i) { B(i,j) -= B(k,j) * A(i,k); /* L40: */ } } /* L50: */ } /* L60: */ } } else { for (j = 1; j <= *n; ++j) { if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,j) = *alpha * B(i,j); /* L70: */ } } for (k = 1; k <= *m; ++k) { if (B(k,j) != 0.) { if (nounit) { B(k,j) /= A(k,k); } for (i = k + 1; i <= *m; ++i) { B(i,j) -= B(k,j) * A(i,k); /* L80: */ } } /* L90: */ } /* L100: */ } } } else { /* Form B := alpha*inv( A' )*B. */ if (upper) { for (j = 1; j <= *n; ++j) { for (i = 1; i <= *m; ++i) { temp = *alpha * B(i,j); for (k = 1; k <= i-1; ++k) { temp -= A(k,i) * B(k,j); /* L110: */ } if (nounit) { temp /= A(i,i); } B(i,j) = temp; /* L120: */ } /* L130: */ } } else { for (j = 1; j <= *n; ++j) { for (i = *m; i >= 1; --i) { temp = *alpha * B(i,j); for (k = i + 1; k <= *m; ++k) { temp -= A(k,i) * B(k,j); /* L140: */ } if (nounit) { temp /= A(i,i); } B(i,j) = temp; /* L150: */ } /* L160: */ } } } } else { if (lsame_(transa, "N")) { /* Form B := alpha*B*inv( A ). */ if (upper) { for (j = 1; j <= *n; ++j) { if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,j) = *alpha * B(i,j); /* L170: */ } } for (k = 1; k <= j-1; ++k) { if (A(k,j) != 0.) { for (i = 1; i <= *m; ++i) { B(i,j) -= A(k,j) * B(i,k); /* L180: */ } } /* L190: */ } if (nounit) { temp = 1. / A(j,j); for (i = 1; i <= *m; ++i) { B(i,j) = temp * B(i,j); /* L200: */ } } /* L210: */ } } else { for (j = *n; j >= 1; --j) { if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,j) = *alpha * B(i,j); /* L220: */ } } for (k = j + 1; k <= *n; ++k) { if (A(k,j) != 0.) { for (i = 1; i <= *m; ++i) { B(i,j) -= A(k,j) * B(i,k); /* L230: */ } } /* L240: */ } if (nounit) { temp = 1. / A(j,j); for (i = 1; i <= *m; ++i) { B(i,j) = temp * B(i,j); /* L250: */ } } /* L260: */ } } } else { /* Form B := alpha*B*inv( A' ). */ if (upper) { for (k = *n; k >= 1; --k) { if (nounit) { temp = 1. / A(k,k); for (i = 1; i <= *m; ++i) { B(i,k) = temp * B(i,k); /* L270: */ } } for (j = 1; j <= k-1; ++j) { if (A(j,k) != 0.) { temp = A(j,k); for (i = 1; i <= *m; ++i) { B(i,j) -= temp * B(i,k); /* L280: */ } } /* L290: */ } if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,k) = *alpha * B(i,k); /* L300: */ } } /* L310: */ } } else { for (k = 1; k <= *n; ++k) { if (nounit) { temp = 1. / A(k,k); for (i = 1; i <= *m; ++i) { B(i,k) = temp * B(i,k); /* L320: */ } } for (j = k + 1; j <= *n; ++j) { if (A(j,k) != 0.) { temp = A(j,k); for (i = 1; i <= *m; ++i) { B(i,j) -= temp * B(i,k); /* L330: */ } } /* L340: */ } if (*alpha != 1.) { for (i = 1; i <= *m; ++i) { B(i,k) = *alpha * B(i,k); /* L350: */ } } /* L360: */ } } } } return 0; /* End of DTRSM . */ } /* dtrsm_ */ #endif