<T>LAPACK 0.1.1
C++ Template Linear Algebra PACKage
Loading...
Searching...
No Matches
transpose.hpp
Go to the documentation of this file.
1
3//
4// Copyright (c) 2021-2023, University of Colorado Denver. All rights reserved.
5//
6// This file is part of <T>LAPACK.
7// <T>LAPACK is free software: you can redistribute it and/or modify it under
8// the terms of the BSD 3-Clause license. See the accompanying LICENSE file.
9
10#ifndef TLAPACK_TRANSPOSE_HH
11#define TLAPACK_TRANSPOSE_HH
12
14
15namespace tlapack {
17 // Optimization parameter. Matrices smaller than nx will not
18 // be transposed using recursion. Must be at least 2.s
19 size_t nx = 16;
20};
21
36template <TLAPACK_SMATRIX matrixA_t, TLAPACK_SMATRIX matrixB_t>
38{
39 using idx_t = size_type<matrixA_t>;
40 using range = pair<idx_t, idx_t>;
41
42 const idx_t m = nrows(A);
43 const idx_t n = ncols(A);
44
45 tlapack_check(m == ncols(B));
46 tlapack_check(n == nrows(B));
47 tlapack_check(opts.nx >= 2);
48
49 if (min(m, n) <= (idx_t)opts.nx) {
50 // The matrix is small, use direct method and end recursion
51 for (idx_t i = 0; i < m; ++i)
52 for (idx_t j = 0; j < n; ++j)
53 B(j, i) = conj(A(i, j));
54 }
55 else {
56 // The matrix is large, split into subblocks and use recursion
57 const idx_t m1 = m / 2;
58 const idx_t n1 = n / 2;
59
60 auto A00 = slice(A, range(0, m1), range(0, n1));
61 auto A01 = slice(A, range(0, m1), range(n1, n));
62 auto A10 = slice(A, range(m1, m), range(0, n1));
63 auto A11 = slice(A, range(m1, m), range(n1, n));
64
65 auto B00 = slice(B, range(0, n1), range(0, m1));
66 auto B01 = slice(B, range(0, n1), range(m1, m));
67 auto B10 = slice(B, range(n1, n), range(0, m1));
68 auto B11 = slice(B, range(n1, n), range(m1, m));
69
70 conjtranspose(A00, B00, opts);
71 conjtranspose(A01, B10, opts);
72 conjtranspose(A10, B01, opts);
73 conjtranspose(A11, B11, opts);
74 }
75}
76
91template <TLAPACK_SMATRIX matrixA_t, TLAPACK_SMATRIX matrixB_t>
93{
94 using idx_t = size_type<matrixA_t>;
95 using range = pair<idx_t, idx_t>;
96
97 const idx_t m = nrows(A);
98 const idx_t n = ncols(A);
99
100 tlapack_check(m == ncols(B));
101 tlapack_check(n == nrows(B));
102 tlapack_check(opts.nx >= 2);
103
104 if (min(m, n) <= (idx_t)opts.nx) {
105 // The matrix is small, use direct method and end recursion
106 for (idx_t i = 0; i < m; ++i)
107 for (idx_t j = 0; j < n; ++j)
108 B(j, i) = A(i, j);
109 }
110 else {
111 // The matrix is large, split into subblocks and use recursion
112 const idx_t m1 = m / 2;
113 const idx_t n1 = n / 2;
114
115 auto A00 = slice(A, range(0, m1), range(0, n1));
116 auto A01 = slice(A, range(0, m1), range(n1, n));
117 auto A10 = slice(A, range(m1, m), range(0, n1));
118 auto A11 = slice(A, range(m1, m), range(n1, n));
119
120 auto B00 = slice(B, range(0, n1), range(0, m1));
121 auto B01 = slice(B, range(0, n1), range(m1, m));
122 auto B10 = slice(B, range(n1, n), range(0, m1));
123 auto B11 = slice(B, range(n1, n), range(m1, m));
124
125 transpose(A00, B00, opts);
126 transpose(A01, B10, opts);
127 transpose(A10, B01, opts);
128 transpose(A11, B11, opts);
129 }
130}
131
132} // namespace tlapack
133
134#endif // TLAPACK_TRANSPOSE_HH
void transpose(matrixA_t &A, matrixB_t &B, const TransposeOpts &opts={})
transpose a matrix A into a matrix B.
Definition transpose.hpp:92
void conjtranspose(matrixA_t &A, matrixB_t &B, const TransposeOpts &opts={})
conjugate transpose a matrix A into a matrix B.
Definition transpose.hpp:37
#define tlapack_check(cond)
Throw an error if cond is false.
Definition exceptionHandling.hpp:98
typename traits::real_type_traits< Types..., int >::type real_type
The common real type of the list of types.
Definition scalar_type_traits.hpp:113
Definition transpose.hpp:16