Compute real eigen values and eigen vectors of a symmetric matrix using QR decomposition method. More...
#include <cassert>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include "./qr_decompose.h"
Go to the source code of this file.
void create_matrix (std::valarray< std::valarray< double > > *A) void mat_mul (const std::valarray< std::valarray< double > > &A, const std::valarray< std::valarray< double > > &B, std::valarray< std::valarray< double > > *OUT) std::valarray< double > qr_algorithm::eigen_values (std::valarray< std::valarray< double > > *A, bool print_intermediates=false) void test1 () void test2 () int main (int argc, char **argv) template<typename T> std::ostream & operator<< (std::ostream &out, std::valarray< std::valarray< T > > const &v)Compute real eigen values and eigen vectors of a symmetric matrix using QR decomposition method.
Definition in file qr_eigen_values.cpp.
◆ LIMS ◆ create_matrix() void create_matrix ( std::valarray< std::valarray< double > > * A )create a symmetric square matrix of given size with random elements. A symmetric square matrix will always have real eigen values.
Definition at line 28 of file qr_eigen_values.cpp.
28 {
29 inti, j, tmp, lim2 =
LIMS>> 1;
30 int N = A->size();
31
32#ifdef _OPENMP
33#pragma omp for
34#endif
35 for (i = 0; i < N; i++) {
36A[0][i][i] = (std::rand() %
LIMS) - lim2;
37 for (j = i + 1; j < N; j++) {
38tmp = (std::rand() %
LIMS) - lim2;
39 A[0][i][j] = tmp;
40 A[0][j][i] = tmp;
41 }
42 }
43}
◆ main() int main ( int argc, char ** argv )main function
Definition at line 243 of file qr_eigen_values.cpp.
243 {
245 if (argc == 2) {
247 } else {
250 std::cout << "Usage: ./qr_eigen_values [mat_size]\n";
251 return 0;
252 }
253
255 fprintf(stderr, "Matrix size should be > 2\n");
256 return -1;
257 }
258
259
260 std::srand(std::time(nullptr));
261
263
264 std::valarray<std::valarray<double>> A(rows);
265
266 for (int i = 0; i < rows; i++) {
267 A[i] = std::valarray<double>(columns);
268 }
269
270
272
273 std::cout << A << "\n";
274
275 clock_t t1 = clock();
277 double dtime = static_cast<double>(clock() - t1) / CLOCKS_PER_SEC;
278
279 std::cout << "Eigen vals: ";
280 for(i = 0; i <
mat_size; i++) std::cout << eigen_vals[i] <<
"\t";
281 std::cout << "\nTime taken to compute: " << dtime << " sec\n";
282
283 return 0;
284}
std::valarray< double > eigen_values(std::valarray< std::valarray< double > > *A, bool print_intermediates=false)
void create_matrix(std::valarray< std::valarray< double > > *A)
◆ mat_mul() void mat_mul ( const std::valarray< std::valarray< double > > & A, const std::valarray< std::valarray< double > > & B, std::valarray< std::valarray< double > > * OUT )Perform multiplication of two matrices.
Definition at line 54 of file qr_eigen_values.cpp.
56 {
57 int R1 = A.size();
58 int C1 = A[0].size();
59 int R2 = B.size();
60 int C2 = B[0].size();
61 if (C1 != R2) {
62 perror("Matrix dimensions mismatch!");
63 return;
64 }
65
66 for (int i = 0; i < R1; i++) {
67 for (int j = 0; j < C2; j++) {
68 OUT[0][i][j] = 0.f;
69 for(
intk = 0;
k< C1;
k++) {
70OUT[0][i][j] += A[i][
k] * B[
k][j];
71 }
72 }
73 }
74}
double k(double x)
Another test function.
◆ operator<<()template<typename T>
std::ostream & qr_algorithm::operator<< ( std::ostream & out, std::valarray< std::valarray< T > > const & v )operator to print a matrix
Definition at line 33 of file qr_decompose.h.
34 {
35 const int width = 12;
36 const char separator = ' ';
37
38 out.precision(4);
39 for (size_t row = 0; row < v.size(); row++) {
40 for (size_t col = 0; col < v[row].size(); col++)
41 out << std::right << std::setw(width) << std::setfill(separator)
42 << v[row][col];
43 out << std::endl;
44 }
45
46 return out;
47}
◆ test1()test function to compute eigen values of a 2x2 matrix
\[\begin{bmatrix} 5 & 7\\ 7 & 11 \end{bmatrix}\]
which are approximately, {15.56158, 0.384227}
Definition at line 177 of file qr_eigen_values.cpp.
177 {
178 std::valarray<std::valarray<double>> X = {{5, 7}, {7, 11}};
179 double y[] = {15.56158, 0.384227};
180
181 std::cout << "------- Test 1 -------" << std::endl;
183
184 for (int i = 0; i < 2; i++) {
185 std::cout << i + 1 << "/2 Checking for " << y[i] << " --> ";
187 for(
intj = 0; j < 2 && !
result; j++) {
188 if (std::abs(y[i] - eig_vals[j]) < 0.1) {
190 std::cout << "(" << eig_vals[j] << ") ";
191 }
192 }
193 assert(result);
194 std::cout << "found\n";
195 }
196 std::cout << "Test 1 Passed\n\n";
197}
uint64_t result(uint64_t n)
◆ test2()test function to compute eigen values of a 2x2 matrix
\[\begin{bmatrix} -4& 4& 2& 0& -3\\ 4& -4& 4& -3& -1\\ 2& 4& 4& 3& -3\\ 0& -3& 3& -1&-1\\ -3& -1& -3& -3& 0 \end{bmatrix}\]
which are approximately, {9.27648, -9.26948, 2.0181, -1.03516, -5.98994}
Definition at line 210 of file qr_eigen_values.cpp.
210 {
211 std::valarray<std::valarray<double>> X = {{-4, 4, 2, 0, -3},
212 {4, -4, 4, -3, -1},
213 {2, 4, 4, 3, -3},
214 {0, -3, 3, -1, -3},
215 {-3, -1, -3, -3, 0}};
216 double y[] = {9.27648, -9.26948, 2.0181, -1.03516,
217 -5.98994};
218
219 std::cout << "------- Test 2 -------" << std::endl;
221
222 std::cout << X << "\n"
223 << "Eigen values: " << eig_vals << "\n";
224
225 for (int i = 0; i < 5; i++) {
226 std::cout << i + 1 << "/5 Checking for " << y[i] << " --> ";
228 for(
intj = 0; j < 5 && !
result; j++) {
229 if (std::abs(y[i] - eig_vals[j]) < 0.1) {
231 std::cout << "(" << eig_vals[j] << ") ";
232 }
233 }
234 assert(result);
235 std::cout << "found\n";
236 }
237 std::cout << "Test 2 Passed\n\n";
238}
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4