bitrl & cuberl Documentation
Simulation engine for reinforcement learning agents
Loading...
Searching...
No Matches
matrix_utilities.h
Go to the documentation of this file.
1#ifndef MATRIX_UTILITIES_H
2#define MATRIX_UTILITIES_H
3
5
6#include <random>
7#include <set>
8#include <initializer_list>
9
10namespace cuberl{
11namespace maths{
12
16template<typename MatType>
17void
18exchange_rows(MatType& mat, uint_t r1, uint_t r2){
19
20 for(uint_t col=0; col<mat.columns(); ++col){
21
22 auto tmp = mat(r1, col);
23 mat(r1, col) = mat(r2, col);
24 mat(r2, col) = tmp;
25 }
26}
27
32template<typename MatType>
33std::set<uint_t>
34shuffle_matrix_rows(MatType& mat){
35
36 uint_t min = 0;
37 uint_t max = mat.rows();
38
39 //Will be used to obtain a seed for the random number engine
40 std::random_device rd;
41 std::mt19937 gen(rd());
42 std::uniform_int_distribution<uint_t> random(min, max);
43
44 std::set<uint_t> touched;
45
46 for(uint_t r=0; r<max; ++r){
47
48 // this row was touched
49 if(touched.find(r) != touched.end()){
50 continue;
51 }
52
53 uint_t candidate = random(gen);
54
55 if(touched.find(candidate) != touched.end()){
56 continue;
57 }
58
59 exchange_rows(mat, r, candidate);
60 touched.insert(r);
61 touched.insert(candidate);
62 }
63
64 return touched;
65}
66
70/*
71template<typename T>
72DynVec<T>
73get_column(const DynMat<T>& matrix, uint_t cidx){
74
75 DynVec<T> column(matrix.rows(), 0.0);
76
77 for(uint_t r=0; r<matrix.rows(); ++r){
78 column[r] = matrix(r, cidx);
79 }
80 return column;
81}
82*/
83
87/*
88template<typename T>
89DynVec<real_t>
90get_column_means(const DynMat<T>& matrix){
91
92 DynVec<real_t> means(matrix.columns(), 0.0);
93
94 for(uint_t c=0; c<matrix.columns(); ++c){
95 auto column = get_column(matrix, c);
96 means[c] = mean(column);
97 }
98
99 return means;
100
101}
102
103*/
104
108/*
109template<typename T>
110DynVec<real_t>
111get_column_variances(const DynMat<T>& matrix){
112
113 DynVec<real_t> means(matrix.columns(), 0.0);
114
115 for(uint_t c=0; c<matrix.columns(); ++c){
116 auto column = get_column(matrix, c);
117 means[c] = var(column);
118 }
119
120 return means;
121
122}
123*/
124
128template<typename T>
130get_row(const DynMat<T>& matrix, uint_t row_idx){
131 return matrix.row(row_idx);
132}
133
134template<typename T>
135T
136get_row_max(const DynMat<T>& matrix, uint_t row_idx){
137
138 auto row = get_row(matrix, row_idx);
139 return row.maxCoeff();
140}
141
142template<typename T>
143T
144get_row_min(const DynMat<T>& matrix, uint_t row_idx){
145
146 auto row = get_row(matrix, row_idx);
147 return row.maxCoeff();
148}
149
150/*template<typename T>
151uint_t
152row_argmax(const DynMat<T>& matrix, uint_t row_idx){
153 auto row = get_row(matrix, row_idx);
154 return blaze::argmax(row);
155}
156
157
158template<typename T>
159uint_t
160row_argmin(const DynMat<T>& matrix, uint_t row_idx){
161 auto row = get_row(matrix, row_idx);
162 return blaze::argmin(row);
163}
164
165
166template<typename T>
167void
168extract_randomly(const DynMat<T>& matrix, std::vector<DynVec<T>>& rsult,
169 uint_t how_many, bool allow_duplicates=false){
170
171 rsult.clear();
172 rsult.reserve(how_many);
173
174 std::random_device rd;
175 std::mt19937 gen(rd());
176 std::uniform_int_distribution<> dis(0, matrix.rows() - 1);
177 std::set<uint_t> touched;
178
179 while(rsult.size() != how_many){
180
181 uint_t idx = dis(gen);
182
183 // this row was touched
184 if((touched.find(idx) != touched.end()) && !allow_duplicates){
185 continue;
186 }
187
188 rsult.push_back(get_row(matrix, idx));
189 touched.insert(idx);
190 }
191}
192
197template<typename T>
198void center_columns(DynMat<T>& matrix, const DynVec<T>& vals){
199
200 for(uint_t r=0; r<matrix.rows(); ++r){
201 for (uint_t c=0; c<matrix.columns(); ++c){
202 matrix(r, c ) -= vals[c];
203 }
204 }
205}
206
211template<typename T>
212DynMat<T> create_identity_matrix(uint_t nrows){
213
214 DynMat<T> mat(nrows, nrows);
215
216 for(uint_t r=0; r<nrows; ++r){
217 for(uint_t c=0; c<nrows; ++c){
218 if(c == r){
219 mat(r, r) = static_cast<T>(1);
220 }
221 else{
222 mat(r, c) = static_cast<T>(0);
223 }
224 }
225 }
226
227 return mat;
228}
229
234template<typename T>
235DynMat<T> create_diagonal_matrix(const std::vector<T>& diagonal){
236
237 DynMat<T> mat(diagonal.size(), diagonal.size());
238
239 for(uint_t r=0; r<diagonal.size(); ++r){
240 for(uint_t c=0; c<diagonal.size(); ++c){
241 if(c == r){
242 mat(r, r) = diagonal[r];
243 }
244 else{
245 mat(r, c) = static_cast<T>(0);
246 }
247 }
248 }
249
250 return mat;
251}
252
253
258template<typename T>
259DynMat<T> create_diagonal_matrix(const std::initializer_list<T>& diagonal){
260
261 std::vector<T> diag(diagonal.begin(), diagonal.end());
262 return create_diagonal_matrix(diag);
263}*/
264
265
266}
267}
268
269#endif // MATRIX_SHUFFLER_H
Eigen::RowVectorX< T > DynVec
Dynamically sized row vector.
Definition bitrl_types.h:74
std::size_t uint_t
uint_t
Definition bitrl_types.h:43
Eigen::MatrixX< T > DynMat
Dynamically sized matrix to use around the library.
Definition bitrl_types.h:49
T get_row_min(const DynMat< T > &matrix, uint_t row_idx)
Definition matrix_utilities.h:144
std::set< uint_t > shuffle_matrix_rows(MatType &mat)
Shuffle the rows of the matrix. Returns a set with the rows that have been shuffled.
Definition matrix_utilities.h:34
void exchange_rows(MatType &mat, uint_t r1, uint_t r2)
Exchange the rows of the matrix.
Definition matrix_utilities.h:18
T get_row_max(const DynMat< T > &matrix, uint_t row_idx)
Definition matrix_utilities.h:136
DynVec< T > get_row(const DynMat< T > &matrix, uint_t row_idx)
Extract the cidx-th column from the matrix.
Definition matrix_utilities.h:130
Various utilities used when working with RL problems.
Definition cuberl_types.h:16