60template <
typename TA,
typename TX,
typename TY>
64 blas::scalar_type<TA, TX, TY> alpha,
65 TX
const *x, int64_t incx,
66 TY
const *y, int64_t incy,
69 typedef blas::scalar_type<TA, TX, TY> scalar_t;
71 #define A(i_, j_) A[ (i_) + (j_)*lda ]
74 const scalar_t zero = 0;
77 blas_error_if( layout != Layout::ColMajor &&
78 layout != Layout::RowMajor );
79 blas_error_if( m < 0 );
80 blas_error_if( n < 0 );
81 blas_error_if( incx == 0 );
82 blas_error_if( incy == 0 );
84 if (layout == Layout::ColMajor)
85 blas_error_if( lda < m );
87 blas_error_if( lda < n );
90 if (m == 0 || n == 0 || alpha == zero)
95 if (layout == Layout::RowMajor) {
96 geru( Layout::ColMajor, n, m, alpha, y, incy, x, incx, A, lda );
100 if (incx == 1 && incy == 1) {
102 for (int64_t j = 0; j < n; ++j) {
104 scalar_t tmp = alpha * y[j];
105 for (int64_t i = 0; i < m; ++i) {
106 A(i, j) += x[i] * tmp;
110 else if (incx == 1) {
112 int64_t jy = (incy > 0 ? 0 : (-n + 1)*incy);
113 for (int64_t j = 0; j < n; ++j) {
114 scalar_t tmp = alpha * y[jy];
115 for (int64_t i = 0; i < m; ++i) {
116 A(i, j) += x[i] * tmp;
123 int64_t kx = (incx > 0 ? 0 : (-m + 1)*incx);
124 int64_t jy = (incy > 0 ? 0 : (-n + 1)*incy);
125 for (int64_t j = 0; j < n; ++j) {
126 scalar_t tmp = alpha * y[jy];
128 for (int64_t i = 0; i < m; ++i) {
129 A(i, j) += x[ix] * tmp;
void geru(blas::Layout layout, int64_t m, int64_t n, blas::scalar_type< TA, TX, TY > alpha, TX const *x, int64_t incx, TY const *y, int64_t incy, TA *A, int64_t lda)
General matrix rank-1 update:
Definition geru.hh:61