![]() |
LAPACK
3.4.1
LAPACK: Linear Algebra PACKage
|
00001 *> \brief \b SLAKF2 00002 * 00003 * =========== DOCUMENTATION =========== 00004 * 00005 * Online html documentation available at 00006 * http://www.netlib.org/lapack/explore-html/ 00007 * 00008 * Definition: 00009 * =========== 00010 * 00011 * SUBROUTINE SLAKF2( M, N, A, LDA, B, D, E, Z, LDZ ) 00012 * 00013 * .. Scalar Arguments .. 00014 * INTEGER LDA, LDZ, M, N 00015 * .. 00016 * .. Array Arguments .. 00017 * REAL A( LDA, * ), B( LDA, * ), D( LDA, * ), 00018 * $ E( LDA, * ), Z( LDZ, * ) 00019 * .. 00020 * 00021 * 00022 *> \par Purpose: 00023 * ============= 00024 *> 00025 *> \verbatim 00026 *> 00027 *> Form the 2*M*N by 2*M*N matrix 00028 *> 00029 *> Z = [ kron(In, A) -kron(B', Im) ] 00030 *> [ kron(In, D) -kron(E', Im) ], 00031 *> 00032 *> where In is the identity matrix of size n and X' is the transpose 00033 *> of X. kron(X, Y) is the Kronecker product between the matrices X 00034 *> and Y. 00035 *> \endverbatim 00036 * 00037 * Arguments: 00038 * ========== 00039 * 00040 *> \param[in] M 00041 *> \verbatim 00042 *> M is INTEGER 00043 *> Size of matrix, must be >= 1. 00044 *> \endverbatim 00045 *> 00046 *> \param[in] N 00047 *> \verbatim 00048 *> N is INTEGER 00049 *> Size of matrix, must be >= 1. 00050 *> \endverbatim 00051 *> 00052 *> \param[in] A 00053 *> \verbatim 00054 *> A is REAL, dimension ( LDA, M ) 00055 *> The matrix A in the output matrix Z. 00056 *> \endverbatim 00057 *> 00058 *> \param[in] LDA 00059 *> \verbatim 00060 *> LDA is INTEGER 00061 *> The leading dimension of A, B, D, and E. ( LDA >= M+N ) 00062 *> \endverbatim 00063 *> 00064 *> \param[in] B 00065 *> \verbatim 00066 *> B is REAL, dimension ( LDA, N ) 00067 *> \endverbatim 00068 *> 00069 *> \param[in] D 00070 *> \verbatim 00071 *> D is REAL, dimension ( LDA, M ) 00072 *> \endverbatim 00073 *> 00074 *> \param[in] E 00075 *> \verbatim 00076 *> E is REAL, dimension ( LDA, N ) 00077 *> 00078 *> The matrices used in forming the output matrix Z. 00079 *> \endverbatim 00080 *> 00081 *> \param[out] Z 00082 *> \verbatim 00083 *> Z is REAL, dimension ( LDZ, 2*M*N ) 00084 *> The resultant Kronecker M*N*2 by M*N*2 matrix (see above.) 00085 *> \endverbatim 00086 *> 00087 *> \param[in] LDZ 00088 *> \verbatim 00089 *> LDZ is INTEGER 00090 *> The leading dimension of Z. ( LDZ >= 2*M*N ) 00091 *> \endverbatim 00092 * 00093 * Authors: 00094 * ======== 00095 * 00096 *> \author Univ. of Tennessee 00097 *> \author Univ. of California Berkeley 00098 *> \author Univ. of Colorado Denver 00099 *> \author NAG Ltd. 00100 * 00101 *> \date November 2011 00102 * 00103 *> \ingroup real_matgen 00104 * 00105 * ===================================================================== 00106 SUBROUTINE SLAKF2( M, N, A, LDA, B, D, E, Z, LDZ ) 00107 * 00108 * -- LAPACK computational routine (version 3.4.0) -- 00109 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00110 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00111 * November 2011 00112 * 00113 * .. Scalar Arguments .. 00114 INTEGER LDA, LDZ, M, N 00115 * .. 00116 * .. Array Arguments .. 00117 REAL A( LDA, * ), B( LDA, * ), D( LDA, * ), 00118 $ E( LDA, * ), Z( LDZ, * ) 00119 * .. 00120 * 00121 * ==================================================================== 00122 * 00123 * .. Parameters .. 00124 REAL ZERO 00125 PARAMETER ( ZERO = 0.0E+0 ) 00126 * .. 00127 * .. Local Scalars .. 00128 INTEGER I, IK, J, JK, L, MN, MN2 00129 * .. 00130 * .. External Subroutines .. 00131 EXTERNAL SLASET 00132 * .. 00133 * .. Executable Statements .. 00134 * 00135 * Initialize Z 00136 * 00137 MN = M*N 00138 MN2 = 2*MN 00139 CALL SLASET( 'Full', MN2, MN2, ZERO, ZERO, Z, LDZ ) 00140 * 00141 IK = 1 00142 DO 50 L = 1, N 00143 * 00144 * form kron(In, A) 00145 * 00146 DO 20 I = 1, M 00147 DO 10 J = 1, M 00148 Z( IK+I-1, IK+J-1 ) = A( I, J ) 00149 10 CONTINUE 00150 20 CONTINUE 00151 * 00152 * form kron(In, D) 00153 * 00154 DO 40 I = 1, M 00155 DO 30 J = 1, M 00156 Z( IK+MN+I-1, IK+J-1 ) = D( I, J ) 00157 30 CONTINUE 00158 40 CONTINUE 00159 * 00160 IK = IK + M 00161 50 CONTINUE 00162 * 00163 IK = 1 00164 DO 90 L = 1, N 00165 JK = MN + 1 00166 * 00167 DO 80 J = 1, N 00168 * 00169 * form -kron(B', Im) 00170 * 00171 DO 60 I = 1, M 00172 Z( IK+I-1, JK+I-1 ) = -B( J, L ) 00173 60 CONTINUE 00174 * 00175 * form -kron(E', Im) 00176 * 00177 DO 70 I = 1, M 00178 Z( IK+MN+I-1, JK+I-1 ) = -E( J, L ) 00179 70 CONTINUE 00180 * 00181 JK = JK + M 00182 80 CONTINUE 00183 * 00184 IK = IK + M 00185 90 CONTINUE 00186 * 00187 RETURN 00188 * 00189 * End of SLAKF2 00190 * 00191 END