Implement functions to create our desired matrix

This commit is contained in:
Cory Balaton 2023-09-16 18:01:26 +02:00
parent 97d13c6d2d
commit 68e665748a
No known key found for this signature in database
GPG Key ID: 3E5FCEBFD80F432B
2 changed files with 54 additions and 0 deletions

16
include/matrix.hpp Normal file
View File

@ -0,0 +1,16 @@
#ifndef __MATRIX__
#define __MATRIX__
#include <armadillo>
arma::mat create_tridiagonal(
const arma::vec& a,
const arma::vec& d,
const arma::vec& e);
arma::mat create_tridiagonal(int n, double a, double d, double e);
arma::mat create_symmetric_tridiagonal(int n, double a, double d);
#endif

38
src/matrix.cpp Normal file
View File

@ -0,0 +1,38 @@
#include "matrix.hpp"
arma::mat create_tridiagonal(
const arma::vec& a,
const arma::vec& d,
const arma::vec& e)
{
int n = d.n_elem;
arma::mat A = arma::mat(n, n).fill(0.);
A(0,0) = d(0);
A(0,1) = e(0);
for (int i = 1; i < n-1; i++) {
A(i, i-1) = a(i-1);
A(i, i) = d(i);
A(i, i+1) = e(i);
}
A(n-1,n-1) = d(n-1);
A(n-1, n-2) = a(n-1);
return A;
}
arma::mat create_tridiagonal(int n, double a, double d, double e)
{
arma::vec a_vec = arma::vec(n-1, arma::fill::ones) * a;
arma::vec d_vec = arma::vec(n-1, arma::fill::ones) * d;
arma::vec e_vec = arma::vec(n-1, arma::fill::ones) * e;
return create_tridiagonal(a_vec, d_vec, e_vec);
}
arma::mat create_symmetric_tridiagonal(int n, double a, double d)
{
return create_tridiagonal(n, a, d, a);
}