1#ifndef COMMS_LINEAR_ALGEBRA_HPP
2#define COMMS_LINEAR_ALGEBRA_HPP
28 for (
size_t i = 0; i <
n; i++) {
29 for (
size_t j = 0; j <= i; j++) {
33 for (
size_t k = 0; k < j; k++) {
34 sum += L[j *
n + k] * L[j *
n + k];
36 double diag = A[i *
n + i] - sum;
40 L[i *
n + i] = std::sqrt(diag);
43 for (
size_t k = 0; k < j; k++) {
44 sum += L[i *
n + k] * L[j *
n + k];
46 L[i *
n + j] = (A[i *
n + j] - sum) / L[j *
n + j];
55 for (
size_t i = 0; i <
n; i++) {
57 for (
size_t j = 0; j < i; j++) {
58 sum += L[i *
n + j] * x[j];
60 x[i] = (
b[i] - sum) / L[i *
n + i];
66 for (
int i =
static_cast<int>(
n) - 1; i >= 0; i--) {
68 for (
size_t j =
static_cast<size_t>(i) + 1; j <
n; j++) {
69 sum += L[j *
n + i] * x[j];
71 x[i] = (
b[i] - sum) / L[i *
n + i];
79 double* L =
new double[
n *
n];
88 double* y =
new double[
n];
103 double* L =
new double[
n *
n];
112 double*
b =
new double[
n];
113 double* x =
new double[
n];
115 for (
size_t j = 0; j <
n; j++) {
117 std::fill(
b,
b +
n, 0.0);
127 for (
size_t i = 0; i <
n; i++) {
128 A_inv[i *
n + j] =
b[i];
142 const double* W_diag,
double* beta) {
144 double* XTWX =
new double[
n *
n];
145 double* XTWy =
new double[
n];
149 for (
size_t i = 0; i <
n; i++) {
150 for (
size_t j = 0; j <
n; j++) {
152 for (
size_t k = 0; k < m; k++) {
153 sum += X[k *
n + i] * W_diag[k] * X[k *
n + j];
155 XTWX[i *
n + j] = sum;
160 std::fill(XTWy, XTWy +
n, 0.0);
161 for (
size_t i = 0; i <
n; i++) {
163 for (
size_t k = 0; k < m; k++) {
164 sum += X[k *
n + i] * W_diag[k] * y[k];
180 const double* W_diag,
double lambda,
double* beta) {
182 double* XTWX =
new double[
n *
n];
183 double* XTWy =
new double[
n];
187 for (
size_t i = 0; i <
n; i++) {
188 for (
size_t j = 0; j <
n; j++) {
190 for (
size_t k = 0; k < m; k++) {
191 sum += X[k *
n + i] * W_diag[k] * X[k *
n + j];
193 XTWX[i *
n + j] = sum;
198 for (
size_t i = 0; i <
n; i++) {
199 XTWX[i *
n + i] += lambda;
203 std::fill(XTWy, XTWy +
n, 0.0);
204 for (
size_t i = 0; i <
n; i++) {
206 for (
size_t k = 0; k < m; k++) {
207 sum += X[k *
n + i] * W_diag[k] * y[k];
*brief create JSON pointer *sa reference_tokens const string_t const string_t & b
bool solve_cholesky(const double *A, size_t n, const double *b, double *x)
void matrix_zeros(double *A, size_t m, size_t n)
bool regularized_weighted_least_squares(const double *X, size_t m, size_t n, const double *y, const double *W_diag, double lambda, double *beta)
void solve_lower_triangular(const double *L, size_t n, const double *b, double *x)
bool matrix_inverse_cholesky(const double *A, size_t n, double *A_inv)
void solve_upper_triangular(const double *L, size_t n, const double *b, double *x)
bool weighted_least_squares(const double *X, size_t m, size_t n, const double *y, const double *W_diag, double *beta)
bool cholesky_decompose(double *A, size_t n, double *L)
Linear algebra operations for sensor calibration and filtering.
Central message header for all communication messages.
*brief user defined string literal for JSON values *sa std::size_t n