Loading...
Searching...
No Matches
manipulation.tpp
1/*---------------------------------------------------------------------------*\
2 *
3 * bitpit
4 *
5 * Copyright (C) 2015-2021 OPTIMAD engineering Srl
6 *
7 * -------------------------------------------------------------------------
8 * License
9 * This file is part of bitpit.
10 *
11 * bitpit is free software: you can redistribute it and/or modify it
12 * under the terms of the GNU Lesser General Public License v3 (LGPL)
13 * as published by the Free Software Foundation.
14 *
15 * bitpit is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18 * License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with bitpit. If not, see <http://www.gnu.org/licenses/>.
22 *
23\*---------------------------------------------------------------------------*/
24
25namespace bitpit{
26namespace linearalgebra{
27
33// -------------------------------------------------------------------------- //
40template <class T>
42 std::vector< std::vector< T > > &A,
43 std::vector< std::vector< T > > &B
44) {
45
46// ========================================================================== //
47// VARIABLES DECLARATION //
48// ========================================================================== //
49
50// Local variables
51int m, n;
52
53// Counters
54int i, j;
55
56// ========================================================================== //
57// CHECK INPUT //
58// ========================================================================== //
59m = A.size();
60if (m == 0) { return; }
61n = A[0].size();
62if (n == 0) { return; }
63
64// ========================================================================== //
65// MATRIX TRANSPOSITION //
66// ========================================================================== //
67
68// Resize output variables
69B.resize(n);
70for (i = 0; i < n; ++i) {
71 B[i].resize(m, (T) 0.0);
72} //next i
73
74// Transposition
75for (i = 0; i < m; i++) {
76 for (j = 0; j < n; j++) {
77 B[j][i] = A[i][j];
78 } //next j
79} //next i
80
81return; };
82
83// -------------------------------------------------------------------------- //
91template <class T, size_t m, size_t n>
93 std::array< std::array< T, n >, m > &A,
94 std::array< std::array< T, m >, n > &B
95) {
96
97// ========================================================================== //
98// VARIABLES DECLARATION //
99// ========================================================================== //
100
101// Local variables
102// none
103
104// Counters
105size_t i, j;
106
107// ========================================================================== //
108// CHECK INPUT //
109// ========================================================================== //
110if (m == 0) { return; }
111if (n == 0) { return; }
112
113// ========================================================================== //
114// MATRIX TRANSPOSITION //
115// ========================================================================== //
116for (i = 0; i < m; i++) {
117 for (j = 0; j < n; j++) {
118 B[j][i] = A[i][j];
119 } //next j
120} //next i
121
122return; };
123
124// -------------------------------------------------------------------------- //
132template <class T>
133std::vector< std::vector< T > > transpose(
134 const std::vector< std::vector< T > > &A
135) {
136
137// ========================================================================== //
138// VARIABLES DECLARATION //
139// ========================================================================== //
140
141// Local variables
142int m = A.size();
143int n(0);
144
145// Counters
146int i, j;
147
148// ========================================================================== //
149// CHECK INPUT //
150// ========================================================================== //
151if (m != 0) n = A[0].size() ;
152
153// ========================================================================== //
154// MATRIX TRANSPOSITION //
155// ========================================================================== //
156
157std::vector< std::vector< T > > B( n, std::vector<T> (m,0.) ) ;
158
159// Transposition
160for (i = 0; i < m; i++) {
161 for (j = 0; j < n; j++) {
162 B[j][i] = A[i][j];
163 } //next j
164} //next i
165
166return B; };
167
168// -------------------------------------------------------------------------- //
176template <class T, size_t m, size_t n>
177std::array< std::array< T, m >, n > transpose(
178 const std::array< std::array< T, n >, m > &A
179) {
180
181// ========================================================================== //
182// VARIABLES DECLARATION //
183// ========================================================================== //
184
185// Local variables
186std::array< std::array< T, m >, n > B ;
187
188// Counters
189size_t i, j;
190
191// ========================================================================== //
192// CHECK INPUT //
193// ========================================================================== //
194// ========================================================================== //
195// MATRIX TRANSPOSITION //
196// ========================================================================== //
197for (i = 0; i < m; i++) {
198 for (j = 0; j < n; j++) {
199 B[j][i] = A[i][j];
200 } //next j
201} //next i
202
203return B; };
204
205// -------------------------------------------------------------------------- //
212template <class T>
213void triL(
214 std::vector< std::vector< T > > &A,
215 std::vector< std::vector< T > > &L
216) {
217
218// ========================================================================== //
219// VARIABLES DECLARATION //
220// ========================================================================== //
221
222// Local variables
223int m, n;
224
225// Counters
226int i, j;
227
228// ========================================================================== //
229// CHECK INPUT COHERENCY //
230// ========================================================================== //
231m = A.size();
232if (m == 0) { return; };
233n = A[0].size();
234
235// ========================================================================== //
236// RESIZE OUTPUT VARIABLES //
237// ========================================================================== //
238zeros(L, m, n);
239
240// ========================================================================== //
241// EXTRACT THE LOWER TRIANGULAR PART OF A //
242// ========================================================================== //
243for (i = 0; i < m; i++) {
244 for (j = 0; j <= i; j++) {
245 L[i][j] = A[i][j];
246 } //next j
247} //next i
248
249return; };
250
251// -------------------------------------------------------------------------- //
260template <class T, size_t m, size_t n>
261void triL(
262 std::array< std::array< T, n >, m > &A,
263 std::array< std::array< T, n >, m > &L
264) {
265
266// ========================================================================== //
267// VARIABLES DECLARATION //
268// ========================================================================== //
269
270// Local variables
271// none
272
273// Counters
274size_t i, j;
275
276// ========================================================================== //
277// CHECK INPUT COHERENCY //
278// ========================================================================== //
279if (m == 0) { return; };
280
281// ========================================================================== //
282// RESIZE OUTPUT VARIABLES //
283// ========================================================================== //
284zeros(L);
285
286// ========================================================================== //
287// EXTRACT THE LOWER TRIANGULAR PART OF A //
288// ========================================================================== //
289for (i = 0; i < m; i++) {
290 for (j = 0; j <= i; j++) {
291 L[i][j] = A[i][j];
292 } //next j
293} //next i
294
295return; };
296
297// -------------------------------------------------------------------------- //
304template <class T>
305void triU(
306 std::vector< std::vector< T > > &A,
307 std::vector< std::vector< T > > &U
308) {
309
310// ========================================================================== //
311// VARIABLES DECLARATION //
312// ========================================================================== //
313
314// Local variables
315int m, n;
316
317// Counters
318int i, j;
319
320// ========================================================================== //
321// CHECK INPUT COHERENCY //
322// ========================================================================== //
323m = A.size();
324if (m == 0) { return; };
325n = A[0].size();
326
327// ========================================================================== //
328// RESIZE OUTPUT VARIABLES //
329// ========================================================================== //
330zeros(U, m, n);
331
332// ========================================================================== //
333// EXTRACT THE LOWER TRIANGULAR PART OF A //
334// ========================================================================== //
335for (i = 0; i < m; i++) {
336 for (j = i; j < n; j++) {
337 U[i][j] = A[i][j];
338 } //next j
339} //next i
340
341return; };
342
343// -------------------------------------------------------------------------- //
351template <class T, size_t m, size_t n>
352void triU(
353 std::array< std::array< T, n >, m > &A,
354 std::array< std::array< T, n >, m > &U
355) {
356
357// ========================================================================== //
358// VARIABLES DECLARATION //
359// ========================================================================== //
360
361// Local variables
362// none
363
364// Counters
365size_t i, j;
366
367// ========================================================================== //
368// CHECK INPUT COHERENCY //
369// ========================================================================== //
370if (m == 0) { return; };
371
372// ========================================================================== //
373// RESIZE OUTPUT VARIABLES //
374// ========================================================================== //
375zeros(U);
376
377// ========================================================================== //
378// EXTRACT THE LOWER TRIANGULAR PART OF A //
379// ========================================================================== //
380for (i = 0; i < m; i++) {
381 for (j = i; j < n; j++) {
382 U[i][j] = A[i][j];
383 } //next j
384} //next i
385
386return; };
387
391}
392}
void transpose(std::vector< std::vector< T > > &, std::vector< std::vector< T > > &)
void triL(std::vector< std::vector< T > > &, std::vector< std::vector< T > > &)
void triU(std::vector< std::vector< T > > &, std::vector< std::vector< T > > &)
void zeros(std::vector< std::vector< T > > &, int, int)
--- layout: doxygen_footer ---