mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
715 lines
18 KiB
715 lines
18 KiB
#include "clapack.h" |
|
|
|
/* Table of constant values */ |
|
|
|
static integer c__1 = 1; |
|
static real c_b14 = 1.f; |
|
static real c_b25 = -1.f; |
|
|
|
/* Subroutine */ int slarfb_(char *side, char *trans, char *direct, char * |
|
storev, integer *m, integer *n, integer *k, real *v, integer *ldv, |
|
real *t, integer *ldt, real *c__, integer *ldc, real *work, integer * |
|
ldwork) |
|
{ |
|
/* System generated locals */ |
|
integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, |
|
work_offset, i__1, i__2; |
|
|
|
/* Local variables */ |
|
integer i__, j; |
|
extern logical lsame_(char *, char *); |
|
extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, |
|
integer *, real *, real *, integer *, real *, integer *, real *, |
|
real *, integer *), scopy_(integer *, real *, |
|
integer *, real *, integer *), strmm_(char *, char *, char *, |
|
char *, integer *, integer *, real *, real *, integer *, real *, |
|
integer *); |
|
char transt[1]; |
|
|
|
|
|
/* -- LAPACK auxiliary routine (version 3.1) -- */ |
|
/* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ |
|
/* November 2006 */ |
|
|
|
/* .. Scalar Arguments .. */ |
|
/* .. */ |
|
/* .. Array Arguments .. */ |
|
/* .. */ |
|
|
|
/* Purpose */ |
|
/* ======= */ |
|
|
|
/* SLARFB applies a real block reflector H or its transpose H' to a */ |
|
/* real m by n matrix C, from either the left or the right. */ |
|
|
|
/* Arguments */ |
|
/* ========= */ |
|
|
|
/* SIDE (input) CHARACTER*1 */ |
|
/* = 'L': apply H or H' from the Left */ |
|
/* = 'R': apply H or H' from the Right */ |
|
|
|
/* TRANS (input) CHARACTER*1 */ |
|
/* = 'N': apply H (No transpose) */ |
|
/* = 'T': apply H' (Transpose) */ |
|
|
|
/* DIRECT (input) CHARACTER*1 */ |
|
/* Indicates how H is formed from a product of elementary */ |
|
/* reflectors */ |
|
/* = 'F': H = H(1) H(2) . . . H(k) (Forward) */ |
|
/* = 'B': H = H(k) . . . H(2) H(1) (Backward) */ |
|
|
|
/* STOREV (input) CHARACTER*1 */ |
|
/* Indicates how the vectors which define the elementary */ |
|
/* reflectors are stored: */ |
|
/* = 'C': Columnwise */ |
|
/* = 'R': Rowwise */ |
|
|
|
/* M (input) INTEGER */ |
|
/* The number of rows of the matrix C. */ |
|
|
|
/* N (input) INTEGER */ |
|
/* The number of columns of the matrix C. */ |
|
|
|
/* K (input) INTEGER */ |
|
/* The order of the matrix T (= the number of elementary */ |
|
/* reflectors whose product defines the block reflector). */ |
|
|
|
/* V (input) REAL array, dimension */ |
|
/* (LDV,K) if STOREV = 'C' */ |
|
/* (LDV,M) if STOREV = 'R' and SIDE = 'L' */ |
|
/* (LDV,N) if STOREV = 'R' and SIDE = 'R' */ |
|
/* The matrix V. See further details. */ |
|
|
|
/* LDV (input) INTEGER */ |
|
/* The leading dimension of the array V. */ |
|
/* If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */ |
|
/* if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */ |
|
/* if STOREV = 'R', LDV >= K. */ |
|
|
|
/* T (input) REAL array, dimension (LDT,K) */ |
|
/* The triangular k by k matrix T in the representation of the */ |
|
/* block reflector. */ |
|
|
|
/* LDT (input) INTEGER */ |
|
/* The leading dimension of the array T. LDT >= K. */ |
|
|
|
/* C (input/output) REAL array, dimension (LDC,N) */ |
|
/* On entry, the m by n matrix C. */ |
|
/* On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */ |
|
|
|
/* LDC (input) INTEGER */ |
|
/* The leading dimension of the array C. LDA >= max(1,M). */ |
|
|
|
/* WORK (workspace) REAL array, dimension (LDWORK,K) */ |
|
|
|
/* LDWORK (input) INTEGER */ |
|
/* The leading dimension of the array WORK. */ |
|
/* If SIDE = 'L', LDWORK >= max(1,N); */ |
|
/* if SIDE = 'R', LDWORK >= max(1,M). */ |
|
|
|
/* ===================================================================== */ |
|
|
|
/* .. Parameters .. */ |
|
/* .. */ |
|
/* .. Local Scalars .. */ |
|
/* .. */ |
|
/* .. External Functions .. */ |
|
/* .. */ |
|
/* .. External Subroutines .. */ |
|
/* .. */ |
|
/* .. Executable Statements .. */ |
|
|
|
/* Quick return if possible */ |
|
|
|
/* Parameter adjustments */ |
|
v_dim1 = *ldv; |
|
v_offset = 1 + v_dim1; |
|
v -= v_offset; |
|
t_dim1 = *ldt; |
|
t_offset = 1 + t_dim1; |
|
t -= t_offset; |
|
c_dim1 = *ldc; |
|
c_offset = 1 + c_dim1; |
|
c__ -= c_offset; |
|
work_dim1 = *ldwork; |
|
work_offset = 1 + work_dim1; |
|
work -= work_offset; |
|
|
|
/* Function Body */ |
|
if (*m <= 0 || *n <= 0) { |
|
return 0; |
|
} |
|
|
|
if (lsame_(trans, "N")) { |
|
*(unsigned char *)transt = 'T'; |
|
} else { |
|
*(unsigned char *)transt = 'N'; |
|
} |
|
|
|
if (lsame_(storev, "C")) { |
|
|
|
if (lsame_(direct, "F")) { |
|
|
|
/* Let V = ( V1 ) (first K rows) */ |
|
/* ( V2 ) */ |
|
/* where V1 is unit lower triangular. */ |
|
|
|
if (lsame_(side, "L")) { |
|
|
|
/* Form H * C or H' * C where C = ( C1 ) */ |
|
/* ( C2 ) */ |
|
|
|
/* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) */ |
|
|
|
/* W := C1' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], |
|
&c__1); |
|
/* L10: */ |
|
} |
|
|
|
/* W := W * V1 */ |
|
|
|
strmm_("Right", "Lower", "No transpose", "Unit", n, k, &c_b14, |
|
&v[v_offset], ldv, &work[work_offset], ldwork); |
|
if (*m > *k) { |
|
|
|
/* W := W + C2'*V2 */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("Transpose", "No transpose", n, k, &i__1, &c_b14, & |
|
c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], |
|
ldv, &c_b14, &work[work_offset], ldwork); |
|
} |
|
|
|
/* W := W * T' or W * T */ |
|
|
|
strmm_("Right", "Upper", transt, "Non-unit", n, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - V * W' */ |
|
|
|
if (*m > *k) { |
|
|
|
/* C2 := C2 - V2 * W' */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("No transpose", "Transpose", &i__1, n, k, &c_b25, & |
|
v[*k + 1 + v_dim1], ldv, &work[work_offset], |
|
ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc); |
|
} |
|
|
|
/* W := W * V1' */ |
|
|
|
strmm_("Right", "Lower", "Transpose", "Unit", n, k, &c_b14, & |
|
v[v_offset], ldv, &work[work_offset], ldwork); |
|
|
|
/* C1 := C1 - W' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *n; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; |
|
/* L20: */ |
|
} |
|
/* L30: */ |
|
} |
|
|
|
} else if (lsame_(side, "R")) { |
|
|
|
/* Form C * H or C * H' where C = ( C1 C2 ) */ |
|
|
|
/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ |
|
|
|
/* W := C1 */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * |
|
work_dim1 + 1], &c__1); |
|
/* L40: */ |
|
} |
|
|
|
/* W := W * V1 */ |
|
|
|
strmm_("Right", "Lower", "No transpose", "Unit", m, k, &c_b14, |
|
&v[v_offset], ldv, &work[work_offset], ldwork); |
|
if (*n > *k) { |
|
|
|
/* W := W + C2 * V2 */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "No transpose", m, k, &i__1, & |
|
c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + |
|
1 + v_dim1], ldv, &c_b14, &work[work_offset], |
|
ldwork); |
|
} |
|
|
|
/* W := W * T or W * T' */ |
|
|
|
strmm_("Right", "Upper", trans, "Non-unit", m, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - W * V' */ |
|
|
|
if (*n > *k) { |
|
|
|
/* C2 := C2 - W * V2' */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "Transpose", m, &i__1, k, &c_b25, & |
|
work[work_offset], ldwork, &v[*k + 1 + v_dim1], |
|
ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc); |
|
} |
|
|
|
/* W := W * V1' */ |
|
|
|
strmm_("Right", "Lower", "Transpose", "Unit", m, k, &c_b14, & |
|
v[v_offset], ldv, &work[work_offset], ldwork); |
|
|
|
/* C1 := C1 - W */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *m; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; |
|
/* L50: */ |
|
} |
|
/* L60: */ |
|
} |
|
} |
|
|
|
} else { |
|
|
|
/* Let V = ( V1 ) */ |
|
/* ( V2 ) (last K rows) */ |
|
/* where V2 is unit upper triangular. */ |
|
|
|
if (lsame_(side, "L")) { |
|
|
|
/* Form H * C or H' * C where C = ( C1 ) */ |
|
/* ( C2 ) */ |
|
|
|
/* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) */ |
|
|
|
/* W := C2' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * |
|
work_dim1 + 1], &c__1); |
|
/* L70: */ |
|
} |
|
|
|
/* W := W * V2 */ |
|
|
|
strmm_("Right", "Upper", "No transpose", "Unit", n, k, &c_b14, |
|
&v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], |
|
ldwork); |
|
if (*m > *k) { |
|
|
|
/* W := W + C1'*V1 */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("Transpose", "No transpose", n, k, &i__1, &c_b14, & |
|
c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & |
|
work[work_offset], ldwork); |
|
} |
|
|
|
/* W := W * T' or W * T */ |
|
|
|
strmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - V * W' */ |
|
|
|
if (*m > *k) { |
|
|
|
/* C1 := C1 - V1 * W' */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("No transpose", "Transpose", &i__1, n, k, &c_b25, & |
|
v[v_offset], ldv, &work[work_offset], ldwork, & |
|
c_b14, &c__[c_offset], ldc) |
|
; |
|
} |
|
|
|
/* W := W * V2' */ |
|
|
|
strmm_("Right", "Upper", "Transpose", "Unit", n, k, &c_b14, & |
|
v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], |
|
ldwork); |
|
|
|
/* C2 := C2 - W' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *n; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * |
|
work_dim1]; |
|
/* L80: */ |
|
} |
|
/* L90: */ |
|
} |
|
|
|
} else if (lsame_(side, "R")) { |
|
|
|
/* Form C * H or C * H' where C = ( C1 C2 ) */ |
|
|
|
/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ |
|
|
|
/* W := C2 */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ |
|
j * work_dim1 + 1], &c__1); |
|
/* L100: */ |
|
} |
|
|
|
/* W := W * V2 */ |
|
|
|
strmm_("Right", "Upper", "No transpose", "Unit", m, k, &c_b14, |
|
&v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], |
|
ldwork); |
|
if (*n > *k) { |
|
|
|
/* W := W + C1 * V1 */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "No transpose", m, k, &i__1, & |
|
c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & |
|
c_b14, &work[work_offset], ldwork); |
|
} |
|
|
|
/* W := W * T or W * T' */ |
|
|
|
strmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - W * V' */ |
|
|
|
if (*n > *k) { |
|
|
|
/* C1 := C1 - W * V1' */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "Transpose", m, &i__1, k, &c_b25, & |
|
work[work_offset], ldwork, &v[v_offset], ldv, & |
|
c_b14, &c__[c_offset], ldc) |
|
; |
|
} |
|
|
|
/* W := W * V2' */ |
|
|
|
strmm_("Right", "Upper", "Transpose", "Unit", m, k, &c_b14, & |
|
v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], |
|
ldwork); |
|
|
|
/* C2 := C2 - W */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *m; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * |
|
work_dim1]; |
|
/* L110: */ |
|
} |
|
/* L120: */ |
|
} |
|
} |
|
} |
|
|
|
} else if (lsame_(storev, "R")) { |
|
|
|
if (lsame_(direct, "F")) { |
|
|
|
/* Let V = ( V1 V2 ) (V1: first K columns) */ |
|
/* where V1 is unit upper triangular. */ |
|
|
|
if (lsame_(side, "L")) { |
|
|
|
/* Form H * C or H' * C where C = ( C1 ) */ |
|
/* ( C2 ) */ |
|
|
|
/* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) */ |
|
|
|
/* W := C1' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], |
|
&c__1); |
|
/* L130: */ |
|
} |
|
|
|
/* W := W * V1' */ |
|
|
|
strmm_("Right", "Upper", "Transpose", "Unit", n, k, &c_b14, & |
|
v[v_offset], ldv, &work[work_offset], ldwork); |
|
if (*m > *k) { |
|
|
|
/* W := W + C2'*V2' */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("Transpose", "Transpose", n, k, &i__1, &c_b14, & |
|
c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + |
|
1], ldv, &c_b14, &work[work_offset], ldwork); |
|
} |
|
|
|
/* W := W * T' or W * T */ |
|
|
|
strmm_("Right", "Upper", transt, "Non-unit", n, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - V' * W' */ |
|
|
|
if (*m > *k) { |
|
|
|
/* C2 := C2 - V2' * W' */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("Transpose", "Transpose", &i__1, n, k, &c_b25, &v[( |
|
*k + 1) * v_dim1 + 1], ldv, &work[work_offset], |
|
ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc); |
|
} |
|
|
|
/* W := W * V1 */ |
|
|
|
strmm_("Right", "Upper", "No transpose", "Unit", n, k, &c_b14, |
|
&v[v_offset], ldv, &work[work_offset], ldwork); |
|
|
|
/* C1 := C1 - W' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *n; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; |
|
/* L140: */ |
|
} |
|
/* L150: */ |
|
} |
|
|
|
} else if (lsame_(side, "R")) { |
|
|
|
/* Form C * H or C * H' where C = ( C1 C2 ) */ |
|
|
|
/* W := C * V' = (C1*V1' + C2*V2') (stored in WORK) */ |
|
|
|
/* W := C1 */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * |
|
work_dim1 + 1], &c__1); |
|
/* L160: */ |
|
} |
|
|
|
/* W := W * V1' */ |
|
|
|
strmm_("Right", "Upper", "Transpose", "Unit", m, k, &c_b14, & |
|
v[v_offset], ldv, &work[work_offset], ldwork); |
|
if (*n > *k) { |
|
|
|
/* W := W + C2 * V2' */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "Transpose", m, k, &i__1, &c_b14, & |
|
c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * |
|
v_dim1 + 1], ldv, &c_b14, &work[work_offset], |
|
ldwork); |
|
} |
|
|
|
/* W := W * T or W * T' */ |
|
|
|
strmm_("Right", "Upper", trans, "Non-unit", m, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - W * V */ |
|
|
|
if (*n > *k) { |
|
|
|
/* C2 := C2 - W * V2 */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "No transpose", m, &i__1, k, & |
|
c_b25, &work[work_offset], ldwork, &v[(*k + 1) * |
|
v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 |
|
+ 1], ldc); |
|
} |
|
|
|
/* W := W * V1 */ |
|
|
|
strmm_("Right", "Upper", "No transpose", "Unit", m, k, &c_b14, |
|
&v[v_offset], ldv, &work[work_offset], ldwork); |
|
|
|
/* C1 := C1 - W */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *m; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; |
|
/* L170: */ |
|
} |
|
/* L180: */ |
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
/* Let V = ( V1 V2 ) (V2: last K columns) */ |
|
/* where V2 is unit lower triangular. */ |
|
|
|
if (lsame_(side, "L")) { |
|
|
|
/* Form H * C or H' * C where C = ( C1 ) */ |
|
/* ( C2 ) */ |
|
|
|
/* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) */ |
|
|
|
/* W := C2' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * |
|
work_dim1 + 1], &c__1); |
|
/* L190: */ |
|
} |
|
|
|
/* W := W * V2' */ |
|
|
|
strmm_("Right", "Lower", "Transpose", "Unit", n, k, &c_b14, & |
|
v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] |
|
, ldwork); |
|
if (*m > *k) { |
|
|
|
/* W := W + C1'*V1' */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("Transpose", "Transpose", n, k, &i__1, &c_b14, & |
|
c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & |
|
work[work_offset], ldwork); |
|
} |
|
|
|
/* W := W * T' or W * T */ |
|
|
|
strmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - V' * W' */ |
|
|
|
if (*m > *k) { |
|
|
|
/* C1 := C1 - V1' * W' */ |
|
|
|
i__1 = *m - *k; |
|
sgemm_("Transpose", "Transpose", &i__1, n, k, &c_b25, &v[ |
|
v_offset], ldv, &work[work_offset], ldwork, & |
|
c_b14, &c__[c_offset], ldc); |
|
} |
|
|
|
/* W := W * V2 */ |
|
|
|
strmm_("Right", "Lower", "No transpose", "Unit", n, k, &c_b14, |
|
&v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ |
|
work_offset], ldwork); |
|
|
|
/* C2 := C2 - W' */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *n; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * |
|
work_dim1]; |
|
/* L200: */ |
|
} |
|
/* L210: */ |
|
} |
|
|
|
} else if (lsame_(side, "R")) { |
|
|
|
/* Form C * H or C * H' where C = ( C1 C2 ) */ |
|
|
|
/* W := C * V' = (C1*V1' + C2*V2') (stored in WORK) */ |
|
|
|
/* W := C2 */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
scopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ |
|
j * work_dim1 + 1], &c__1); |
|
/* L220: */ |
|
} |
|
|
|
/* W := W * V2' */ |
|
|
|
strmm_("Right", "Lower", "Transpose", "Unit", m, k, &c_b14, & |
|
v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] |
|
, ldwork); |
|
if (*n > *k) { |
|
|
|
/* W := W + C1 * V1' */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "Transpose", m, k, &i__1, &c_b14, & |
|
c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & |
|
work[work_offset], ldwork); |
|
} |
|
|
|
/* W := W * T or W * T' */ |
|
|
|
strmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b14, &t[ |
|
t_offset], ldt, &work[work_offset], ldwork); |
|
|
|
/* C := C - W * V */ |
|
|
|
if (*n > *k) { |
|
|
|
/* C1 := C1 - W * V1 */ |
|
|
|
i__1 = *n - *k; |
|
sgemm_("No transpose", "No transpose", m, &i__1, k, & |
|
c_b25, &work[work_offset], ldwork, &v[v_offset], |
|
ldv, &c_b14, &c__[c_offset], ldc); |
|
} |
|
|
|
/* W := W * V2 */ |
|
|
|
strmm_("Right", "Lower", "No transpose", "Unit", m, k, &c_b14, |
|
&v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ |
|
work_offset], ldwork); |
|
|
|
/* C1 := C1 - W */ |
|
|
|
i__1 = *k; |
|
for (j = 1; j <= i__1; ++j) { |
|
i__2 = *m; |
|
for (i__ = 1; i__ <= i__2; ++i__) { |
|
c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * |
|
work_dim1]; |
|
/* L230: */ |
|
} |
|
/* L240: */ |
|
} |
|
|
|
} |
|
|
|
} |
|
} |
|
|
|
return 0; |
|
|
|
/* End of SLARFB */ |
|
|
|
} /* slarfb_ */
|
|
|