72template <
typename TA,
typename TX>
79 TA
const *A, int64_t lda,
82 #define A(i_, j_) A[ (i_) + (j_)*lda ]
85 blas_error_if( layout != Layout::ColMajor &&
86 layout != Layout::RowMajor );
87 blas_error_if( uplo != Uplo::Lower &&
88 uplo != Uplo::Upper );
89 blas_error_if( trans != Op::NoTrans &&
91 trans != Op::ConjTrans );
92 blas_error_if( diag != Diag::NonUnit &&
94 blas_error_if( n < 0 );
95 blas_error_if( lda < n );
96 blas_error_if( incx == 0 );
105 if (layout == Layout::RowMajor) {
106 uplo = (uplo == Uplo::Lower ? Uplo::Upper : Uplo::Lower);
107 if (trans == Op::NoTrans) {
111 if (trans == Op::ConjTrans) {
118 bool nonunit = (diag == Diag::NonUnit);
119 int64_t kx = (incx > 0 ? 0 : (-n + 1)*incx);
121 if (trans == Op::NoTrans && ! doconj) {
123 if (uplo == Uplo::Upper) {
127 for (int64_t j = n - 1; j >= 0; --j) {
133 for (int64_t i = j - 1; i >= 0; --i) {
134 x[i] -= tmp * A(i, j);
140 int64_t jx = kx + (n - 1)*incx;
141 for (int64_t j = n - 1; j >= 0; --j) {
148 for (int64_t i = j - 1; i >= 0; --i) {
150 x[ix] -= tmp * A(i, j);
160 for (int64_t j = 0; j < n; ++j) {
166 for (int64_t i = j + 1; i < n; ++i) {
167 x[i] -= tmp * A(i, j);
174 for (int64_t j = 0; j < n; ++j) {
181 for (int64_t i = j+1; i < n; ++i) {
183 x[ix] -= tmp * A(i, j);
190 else if (trans == Op::NoTrans && doconj) {
192 if (uplo == Uplo::Upper) {
196 for (int64_t j = n - 1; j >= 0; --j) {
199 x[j] /= conj( A(j, j) );
202 for (int64_t i = j - 1; i >= 0; --i) {
203 x[i] -= tmp * conj( A(i, j) );
209 int64_t jx = kx + (n - 1)*incx;
210 for (int64_t j = n - 1; j >= 0; --j) {
213 x[jx] /= conj( A(j, j) );
217 for (int64_t i = j - 1; i >= 0; --i) {
219 x[ix] -= tmp * conj( A(i, j) );
229 for (int64_t j = 0; j < n; ++j) {
232 x[j] /= conj( A(j, j) );
235 for (int64_t i = j + 1; i < n; ++i) {
236 x[i] -= tmp * conj( A(i, j) );
243 for (int64_t j = 0; j < n; ++j) {
246 x[jx] /= conj( A(j, j) );
250 for (int64_t i = j+1; i < n; ++i) {
252 x[ix] -= tmp * conj( A(i, j) );
259 else if (trans == Op::Trans) {
261 if (uplo == Uplo::Upper) {
265 for (int64_t j = 0; j < n; ++j) {
267 for (int64_t i = 0; i <= j - 1; ++i) {
268 tmp -= A(i, j) * x[i];
279 for (int64_t j = 0; j < n; ++j) {
282 for (int64_t i = 0; i <= j - 1; ++i) {
283 tmp -= A(i, j) * x[ix];
298 for (int64_t j = n - 1; j >= 0; --j) {
300 for (int64_t i = j + 1; i < n; ++i) {
301 tmp -= A(i, j) * x[i];
313 for (int64_t j = n - 1; j >= 0; --j) {
316 for (int64_t i = n - 1; i >= j + 1; --i) {
317 tmp -= A(i, j) * x[ix];
332 if (uplo == Uplo::Upper) {
336 for (int64_t j = 0; j < n; ++j) {
338 for (int64_t i = 0; i <= j - 1; ++i) {
339 tmp -= conj( A(i, j) ) * x[i];
342 tmp /= conj( A(j, j) );
350 for (int64_t j = 0; j < n; ++j) {
353 for (int64_t i = 0; i <= j - 1; ++i) {
354 tmp -= conj( A(i, j) ) * x[ix];
358 tmp /= conj( A(j, j) );
369 for (int64_t j = n - 1; j >= 0; --j) {
371 for (int64_t i = j + 1; i < n; ++i) {
372 tmp -= conj( A(i, j) ) * x[i];
375 tmp /= conj( A(j, j) );
384 for (int64_t j = n - 1; j >= 0; --j) {
387 for (int64_t i = n - 1; i >= j + 1; --i) {
388 tmp -= conj( A(i, j) ) * x[ix];
392 tmp /= conj( A(j, j) );
void trsv(blas::Layout layout, blas::Uplo uplo, blas::Op trans, blas::Diag diag, int64_t n, TA const *A, int64_t lda, TX *x, int64_t incx)
Solve the triangular matrix-vector equation.
Definition trsv.hh:73