LAPACK 3.3.0
|
00001 SUBROUTINE DLAPMT( FORWRD, M, N, X, LDX, K ) 00002 * 00003 * -- LAPACK auxiliary routine (version 3.2) -- 00004 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00005 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00006 * November 2006 00007 * 00008 * .. Scalar Arguments .. 00009 LOGICAL FORWRD 00010 INTEGER LDX, M, N 00011 * .. 00012 * .. Array Arguments .. 00013 INTEGER K( * ) 00014 DOUBLE PRECISION X( LDX, * ) 00015 * .. 00016 * 00017 * Purpose 00018 * ======= 00019 * 00020 * DLAPMT rearranges the columns of the M by N matrix X as specified 00021 * by the permutation K(1),K(2),...,K(N) of the integers 1,...,N. 00022 * If FORWRD = .TRUE., forward permutation: 00023 * 00024 * X(*,K(J)) is moved X(*,J) for J = 1,2,...,N. 00025 * 00026 * If FORWRD = .FALSE., backward permutation: 00027 * 00028 * X(*,J) is moved to X(*,K(J)) for J = 1,2,...,N. 00029 * 00030 * Arguments 00031 * ========= 00032 * 00033 * FORWRD (input) LOGICAL 00034 * = .TRUE., forward permutation 00035 * = .FALSE., backward permutation 00036 * 00037 * M (input) INTEGER 00038 * The number of rows of the matrix X. M >= 0. 00039 * 00040 * N (input) INTEGER 00041 * The number of columns of the matrix X. N >= 0. 00042 * 00043 * X (input/output) DOUBLE PRECISION array, dimension (LDX,N) 00044 * On entry, the M by N matrix X. 00045 * On exit, X contains the permuted matrix X. 00046 * 00047 * LDX (input) INTEGER 00048 * The leading dimension of the array X, LDX >= MAX(1,M). 00049 * 00050 * K (input/output) INTEGER array, dimension (N) 00051 * On entry, K contains the permutation vector. K is used as 00052 * internal workspace, but reset to its original value on 00053 * output. 00054 * 00055 * ===================================================================== 00056 * 00057 * .. Local Scalars .. 00058 INTEGER I, II, IN, J 00059 DOUBLE PRECISION TEMP 00060 * .. 00061 * .. Executable Statements .. 00062 * 00063 IF( N.LE.1 ) 00064 $ RETURN 00065 * 00066 DO 10 I = 1, N 00067 K( I ) = -K( I ) 00068 10 CONTINUE 00069 * 00070 IF( FORWRD ) THEN 00071 * 00072 * Forward permutation 00073 * 00074 DO 50 I = 1, N 00075 * 00076 IF( K( I ).GT.0 ) 00077 $ GO TO 40 00078 * 00079 J = I 00080 K( J ) = -K( J ) 00081 IN = K( J ) 00082 * 00083 20 CONTINUE 00084 IF( K( IN ).GT.0 ) 00085 $ GO TO 40 00086 * 00087 DO 30 II = 1, M 00088 TEMP = X( II, J ) 00089 X( II, J ) = X( II, IN ) 00090 X( II, IN ) = TEMP 00091 30 CONTINUE 00092 * 00093 K( IN ) = -K( IN ) 00094 J = IN 00095 IN = K( IN ) 00096 GO TO 20 00097 * 00098 40 CONTINUE 00099 * 00100 50 CONTINUE 00101 * 00102 ELSE 00103 * 00104 * Backward permutation 00105 * 00106 DO 90 I = 1, N 00107 * 00108 IF( K( I ).GT.0 ) 00109 $ GO TO 80 00110 * 00111 K( I ) = -K( I ) 00112 J = K( I ) 00113 60 CONTINUE 00114 IF( J.EQ.I ) 00115 $ GO TO 80 00116 * 00117 DO 70 II = 1, M 00118 TEMP = X( II, I ) 00119 X( II, I ) = X( II, J ) 00120 X( II, J ) = TEMP 00121 70 CONTINUE 00122 * 00123 K( J ) = -K( J ) 00124 J = K( J ) 00125 GO TO 60 00126 * 00127 80 CONTINUE 00128 * 00129 90 CONTINUE 00130 * 00131 END IF 00132 * 00133 RETURN 00134 * 00135 * End of DLAPMT 00136 * 00137 END