cgv
Loading...
Searching...
No Matches
permute.h
1#pragma once
2
3#include <vector>
4
5namespace cgv {
6 namespace math {
7
9 template <typename T, typename I>
10 void permute_array(size_t N, T* A, I* P) {
11 for (size_t i = 0; i < N; ++i) {
12 if (P[i] < 0) {
13 // unmark permutation index
14 P[i] = -P[i] - 1;
15 continue;
16 }
17 T v = A[i];
18 I j = P[i];
19 while (j != i) {
20 std::swap(A[j], v);
21 I old_j = j;
22 j = P[j];
23 P[old_j] = -P[old_j] - 1;
24 }
25 A[i] = v;
26 }
27 }
29 template <typename T, typename I>
30 void permute_vector(std::vector<T>& V, std::vector<I>& P) {
31 permute_array(V.size(), &V.front(), &P.front());
32 }
33
35 template <typename T, typename I>
36 void permute_arrays(T* data, I* P, size_t nr_rows, size_t nr_columns, size_t row_step, size_t column_step)
37 {
38 for (size_t y = 0; y < nr_columns; ++y) {
39 for (size_t x = 0; x < nr_rows; ++x) {
40 if (P[x] < 0) {
41 P[x] = -P[x] - 1;
42 continue;
43 }
44 T v = data[x*row_step + y*column_step];
45 size_t j = P[x];
46 while (j != x) {
47 std::swap(data[j*row_step + y*column_step], v);
48 size_t old_j = j;
49 j = P[j];
50 P[old_j] = -P[old_j] - 1;
51 }
52 data[x*row_step + y*column_step] = v;
53 }
54 }
55 }
56
57
58 }
59}
the cgv namespace
Definition print.h:11