RcdMathLib_doc
Open Source Library for Linear and Non-linear Algebra
matrix.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2020 Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
3  * 2020 Freie Universität Berlin
4  *
5  * This file is subject to the terms and conditions of the GNU Lesser General
6  * Public License v2.1. See the file LICENSE in the top level directory for more
7  * details.
8  */
9 
25 #ifndef MATRIX_H_
26 #define MATRIX_H_
27 
28 #include <inttypes.h>
29 #include <stdbool.h>
30 
36 //#define matrix_t float
37 #ifndef matrix_t
38 #define matrix_t double
39 #endif
40 
45 #ifndef MACHEPS
46 #define MACHEPS 2E-16
47 #endif
48 
53 #ifndef M_PI
54 #define M_PI 3.14159265358979323846
55 #endif
56 
60 typedef struct {
61  uint8_t row_num;
62  uint8_t col_num;
64 } matrix_dim_t;
65 
75 void matrix_init(uint8_t m, uint8_t n, matrix_t matrix[m][n], matrix_t value);
76 
85 void matrix_clear(uint8_t m, uint8_t n, matrix_t matrix[m][n]);
86 
96 void matrix_transpose(uint8_t m, uint8_t n, matrix_t src_matrix[m][n],
97  matrix_t dest_matrix[n][m]);
98 
109 void matrix_in_place_transpose(uint8_t m, matrix_t matrix[][m]);
110 
120 void matrix_copy(uint8_t m, uint8_t n, matrix_t src_matrix[m][n],
121  matrix_t dest_matrix[m][n]);
140 void matrix_part_copy(uint8_t m, uint8_t n, matrix_t src_matrix[m][n],
141  uint8_t start_row_ind, uint8_t end_row_ind,
142  uint8_t start_col_ind, uint8_t end_col_ind,
143  uint8_t dest_row_num, uint8_t dest_col_num,
144  matrix_t dest_matrix[][dest_col_num]);
145 
162 uint8_t matrix_get_rank(uint8_t m, uint8_t n, matrix_t singl_values_arr[],
163  uint8_t length);
164 
176 void matrix_add(uint8_t m, uint8_t n, matrix_t A[m][n], matrix_t B[m][n],
177  matrix_t A_plus_B[m][n]);
178 
188 void matrix_add_to_diag(uint8_t n, matrix_t A[][n], uint8_t diag_el_num,
189  matrix_t value);
190 
203 void matrix_sub(uint8_t m, uint8_t n, matrix_t A[m][n], matrix_t B[m][n],
204  matrix_t A_minus_B[m][n]);
205 
218 void matrix_mul(uint8_t a_line_num, uint8_t a_col_num,
219  matrix_t a_matrix[a_line_num][a_col_num],
220  uint8_t b_line_num, uint8_t b_col_num,
221  matrix_t b_matrix[b_line_num][b_col_num],
222  matrix_t dest_matrix[a_line_num][b_col_num]);
223 
244 void matrix_part_mul(uint8_t a_col_num_max, matrix_t a_matrix[][a_col_num_max],
245  uint8_t b_col_num_max, matrix_t b_matrix[][b_col_num_max],
246  uint8_t a_start_row_ind, uint8_t a_end_row_ind,
247  uint8_t a_start_col_ind, uint8_t a_end_col_ind,
248  uint8_t b_start_row_ind, uint8_t b_end_row_ind,
249  uint8_t b_start_col_ind, uint8_t b_end_col_ind,
250  uint8_t dest_col_size,
251  matrix_t dest_matrix[][dest_col_size]);
252 
267 void matrix_mul_vec(uint8_t m, uint8_t n, matrix_t matrix[m][n],
268  matrix_t vec[n], matrix_t dst_arr[m]);
269 
270 //A'(n,m)*b(m,1) = c(n,1)
285 void matrix_trans_mul_vec(uint8_t m, uint8_t n, matrix_t A[m][n],
286  uint8_t b_size, matrix_t b_vec[m], matrix_t c_vec[n]);
287 
288 
302 void matrix_mul_col_vec_row_vec(uint8_t m, matrix_t col_vec[m], uint8_t n,
303  matrix_t row_vec[n], uint8_t max_n,
304  matrix_t res_mat[][max_n]);
305 
306 
321 void matrix_vec_mul_matr(uint8_t m, uint8_t n, matrix_t vec[m],
322  matrix_t matrix[m][n], matrix_t dst_arr[n]);
323 
324 
341 void matrix_mul_scalar_vec_matr(uint8_t m, uint8_t n, matrix_t scalar,
342  matrix_t vec[m], matrix_t matrix[m][n],
343  matrix_t dst_arr[n]);
344 
345 
356 void matrix_trans_mul_itself(uint8_t m, uint8_t n, matrix_t A[m][n],
357  matrix_t AT_mul_A[n][n]);
358 
368 void matrix_set_diag_elements(uint8_t m, uint8_t n, matrix_t value,
369  matrix_t diag_matrix[m][n]);
370 
383 void matrix_get_diag_mat_new(uint8_t m, uint8_t n, matrix_t diag_matrix[m][n],
384  uint8_t length, matrix_t vec[]);
385 
395 void matrix_get_diag_mat(uint8_t m, uint8_t n, matrix_t value,
396  matrix_t diag_matrix[m][n]);
397 
408 void matrix_mul_scalar(uint8_t m, uint8_t n, matrix_t mat_src[m][n],
409  matrix_t value, matrix_t mat_dest[m][n]);
410 
421 void matrix_get_column_vec(uint8_t m, uint8_t n, matrix_t matrix[m][n],
422  uint8_t col_num, matrix_t col_vec[m]);
423 
435 void matrix_get_part_column_vec(uint8_t max_m, uint8_t max_n,
436  matrix_t matrix[max_m][max_n], uint8_t col_num,
437  uint8_t offset,
438  matrix_t col_vec[max_m - offset]);
439 
451 matrix_t matrix_get_max_elem_in_column(uint8_t m, uint8_t n,
452  matrix_t matrix[m][n], uint8_t col_num);
453 
466 matrix_t matrix_get_abs_max_elem_in_column(uint8_t m, uint8_t n,
467  matrix_t matrix[m][n],
468  uint8_t col_num);
469 
482 matrix_t matrix_get_max_elem_in_part_column(uint8_t max_m, uint8_t max_n,
483  matrix_t matrix[max_m][max_n],
484  uint8_t row_num, uint8_t col_num);
485 
498 matrix_t matrix_get_abs_max_elem_in_part_column(uint8_t max_m, uint8_t max_n,
499  matrix_t matrix[max_m][max_n],
500  uint8_t row_num,
501  uint8_t col_num);
502 
518  uint8_t max_n,
519  matrix_t matrix[max_m][max_n],
520  uint8_t row_num, uint8_t col_num,
521  uint8_t *index);
532 void matrix_swap_rows(uint8_t n, matrix_t matrix[][n], uint8_t i, uint8_t j);
533 
546 void matrix_part_swap_rows(uint8_t n, matrix_t matrix[][n], uint8_t i,
547  uint8_t j, uint8_t col_begin,
548  uint8_t col_end);
560 double matrix_get_two_norm(uint8_t m, uint8_t n, matrix_t A[][n]);
561 
573 double matrix_get_frob_norm(uint8_t m, uint8_t n, matrix_t A[][n]);
574 
584 void matrix_get_inv_upp_triang(uint8_t m, uint8_t n, matrix_t U[][n],
585  matrix_t inv_U[][m]);
595 void matrix_get_inv_low_triang(uint8_t m, uint8_t n, matrix_t L[][n],
596  matrix_t inv_L[][m]);
606 void matrix_get_upp_triang(uint8_t m, uint8_t n, matrix_t A[][n],
607  matrix_t tr_up_A[][n]);
617 void matrix_get_low_triang(uint8_t m, uint8_t n, matrix_t A[][n],
618  matrix_t tr_low_A[][n]);
619 
628 void matrix_print(uint8_t m, uint8_t n, matrix_t matrix[m][n]);
629 
642 void matrix_part_print(uint8_t m, uint8_t n, matrix_t matrix[m][n],
643  uint8_t start_row_ind, uint8_t end_row_ind,
644  uint8_t start_col_ind, uint8_t end_col_ind);
645 
662 void matrix_flex_print(uint8_t m, uint8_t n, matrix_t matrix[m][n],
663  uint8_t before_dec, uint8_t after_dec);
664 
665 
686 void matrix_flex_part_print(uint8_t m, uint8_t n, matrix_t matrix[m][n],
687  uint8_t start_row_ind, uint8_t end_row_ind,
688  uint8_t start_col_ind, uint8_t end_col_ind,
689  uint8_t before_dot, uint8_t after_dot);
690 
691 
710 void matrix_part_mul_scalar_vec_matr(uint8_t max_m, uint8_t max_n,
711  matrix_t scalar, matrix_t vec[max_m],
712  matrix_t matrix[max_m][max_n],
713  uint8_t begin_row, uint8_t begin_column,
714  matrix_t dst_arr[max_n - begin_row]);
715 
729 matrix_t matrix_read(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t i,
730  uint8_t j);
743 void matrix_write(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t i,
744  uint8_t j, matrix_t val);
745 
746 #endif /* MATRIX_H_ */
matrix_get_part_column_vec
void matrix_get_part_column_vec(uint8_t max_m, uint8_t max_n, matrix_t matrix[max_m][max_n], uint8_t col_num, uint8_t offset, matrix_t col_vec[max_m - offset])
Get a part of a column of a matrix.
Definition: matrix.c:623
matrix_mul_vec
void matrix_mul_vec(uint8_t m, uint8_t n, matrix_t matrix[m][n], matrix_t vec[n], matrix_t dst_arr[m])
Compute the multiplication of a matrix with a column vector.
Definition: matrix.c:434
matrix_clear
void matrix_clear(uint8_t m, uint8_t n, matrix_t matrix[m][n])
Clear all the elements of the vector.
Definition: matrix.c:46
matrix_swap_rows
void matrix_swap_rows(uint8_t n, matrix_t matrix[][n], uint8_t i, uint8_t j)
Swaps two rows of a matrix.
Definition: matrix.c:725
matrix_dim_t::row_num
uint8_t row_num
the row number
Definition: matrix.h:61
matrix_sub
void matrix_sub(uint8_t m, uint8_t n, matrix_t A[m][n], matrix_t B[m][n], matrix_t A_minus_B[m][n])
Compute the subtraction of two matrices.
Definition: matrix.c:329
matrix_get_abs_max_elem_in_column
matrix_t matrix_get_abs_max_elem_in_column(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t col_num)
Get the maximum absolute value of a column vector in a matrix.
Definition: matrix.c:651
matrix_write
void matrix_write(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t i, uint8_t j, matrix_t val)
Write a value in a matrix at the position (i,j).
Definition: matrix.c:901
matrix_get_max_elem_in_part_column
matrix_t matrix_get_max_elem_in_part_column(uint8_t max_m, uint8_t max_n, matrix_t matrix[max_m][max_n], uint8_t row_num, uint8_t col_num)
Get the largest element of a column vector in a sub-matrix.
Definition: matrix.c:668
matrix_part_mul_scalar_vec_matr
void matrix_part_mul_scalar_vec_matr(uint8_t max_m, uint8_t max_n, matrix_t scalar, matrix_t vec[max_m], matrix_t matrix[max_m][max_n], uint8_t begin_row, uint8_t begin_column, matrix_t dst_arr[max_n - begin_row])
Compute the multiplication of a scalar with row vector and a sub-matrix.
Definition: matrix.c:489
matrix_part_mul
void matrix_part_mul(uint8_t a_col_num_max, matrix_t a_matrix[][a_col_num_max], uint8_t b_col_num_max, matrix_t b_matrix[][b_col_num_max], uint8_t a_start_row_ind, uint8_t a_end_row_ind, uint8_t a_start_col_ind, uint8_t a_end_col_ind, uint8_t b_start_row_ind, uint8_t b_end_row_ind, uint8_t b_start_col_ind, uint8_t b_end_col_ind, uint8_t dest_col_size, matrix_t dest_matrix[][dest_col_size])
Compute the partial multiplication of two matrices.
Definition: matrix.c:391
matrix_transpose
void matrix_transpose(uint8_t m, uint8_t n, matrix_t src_matrix[m][n], matrix_t dest_matrix[n][m])
Computes the transpose of a matrix.
Definition: matrix.c:56
matrix_add
void matrix_add(uint8_t m, uint8_t n, matrix_t A[m][n], matrix_t B[m][n], matrix_t A_plus_B[m][n])
Compute the addition of two matrices.
Definition: matrix.c:341
matrix_trans_mul_itself
void matrix_trans_mul_itself(uint8_t m, uint8_t n, matrix_t A[m][n], matrix_t AT_mul_A[n][n])
Compute the multiplication of the transpose of a matrix with itself.
Definition: matrix.c:545
matrix_part_print
void matrix_part_print(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t start_row_ind, uint8_t end_row_ind, uint8_t start_col_ind, uint8_t end_col_ind)
Display the values of the sub-matrix elements.
Definition: matrix.c:164
matrix_add_to_diag
void matrix_add_to_diag(uint8_t n, matrix_t A[][n], uint8_t diag_el_num, matrix_t value)
Add a number to diagonal elements of a matrix.
Definition: matrix.c:353
matrix_get_rank
uint8_t matrix_get_rank(uint8_t m, uint8_t n, matrix_t singl_values_arr[], uint8_t length)
Compute the rank of a matrix.
Definition: matrix.c:312
matrix_get_upp_triang
void matrix_get_upp_triang(uint8_t m, uint8_t n, matrix_t A[][n], matrix_t tr_up_A[][n])
Gets the upper triangular part of a matrix.
Definition: matrix.c:841
matrix_trans_mul_vec
void matrix_trans_mul_vec(uint8_t m, uint8_t n, matrix_t A[m][n], uint8_t b_size, matrix_t b_vec[m], matrix_t c_vec[n])
Compute the multiplication of transposed matrix with column vector.
Definition: matrix.c:511
matrix_vec_mul_matr
void matrix_vec_mul_matr(uint8_t m, uint8_t n, matrix_t vec[m], matrix_t matrix[m][n], matrix_t dst_arr[n])
Compute the multiplication of row vector and a matrix.
Definition: matrix.c:452
matrix_get_diag_mat
void matrix_get_diag_mat(uint8_t m, uint8_t n, matrix_t value, matrix_t diag_matrix[m][n])
Create a diagonal matrix with a specified value.
Definition: matrix.c:594
matrix_flex_print
void matrix_flex_print(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t before_dec, uint8_t after_dec)
Display the values of the matrix elements.
Definition: matrix.c:220
matrix_mul_col_vec_row_vec
void matrix_mul_col_vec_row_vec(uint8_t m, matrix_t col_vec[m], uint8_t n, matrix_t row_vec[n], uint8_t max_n, matrix_t res_mat[][max_n])
Compute the multiplication of a column and row vector.
Definition: matrix.c:531
matrix_get_low_triang
void matrix_get_low_triang(uint8_t m, uint8_t n, matrix_t A[][n], matrix_t tr_low_A[][n])
Gets the lower triangular part of a matrix.
Definition: matrix.c:868
matrix_mul_scalar
void matrix_mul_scalar(uint8_t m, uint8_t n, matrix_t mat_src[m][n], matrix_t value, matrix_t mat_dest[m][n])
Multiply all elements of a matrix with a specified value.
Definition: matrix.c:602
matrix_dim_t
A structure to define the row and column number of a matrix.
Definition: matrix.h:60
matrix_flex_part_print
void matrix_flex_part_print(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t start_row_ind, uint8_t end_row_ind, uint8_t start_col_ind, uint8_t end_col_ind, uint8_t before_dot, uint8_t after_dot)
Display the values of the sub-matrix elements.
Definition: matrix.c:247
matrix_get_inv_low_triang
void matrix_get_inv_low_triang(uint8_t m, uint8_t n, matrix_t L[][n], matrix_t inv_L[][m])
Computes the inverse a lower triangular matrix.
Definition: matrix.c:817
matrix_get_two_norm
double matrix_get_two_norm(uint8_t m, uint8_t n, matrix_t A[][n])
Get the 2-norm of a matrix that is equal to the largest singular value.
Definition: matrix.c:752
matrix_mul_scalar_vec_matr
void matrix_mul_scalar_vec_matr(uint8_t m, uint8_t n, matrix_t scalar, matrix_t vec[m], matrix_t matrix[m][n], matrix_t dst_arr[n])
Compute the multiplication of a scalar with row vector and a matrix.
Definition: matrix.c:470
matrix_read
matrix_t matrix_read(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t i, uint8_t j)
Get the value of a matrix at the position (i,j).
Definition: matrix.c:895
matrix_copy
void matrix_copy(uint8_t m, uint8_t n, matrix_t src_matrix[m][n], matrix_t dest_matrix[m][n])
Copy the elements of a matrix to another matrix.
Definition: matrix.c:83
matrix_set_diag_elements
void matrix_set_diag_elements(uint8_t m, uint8_t n, matrix_t value, matrix_t diag_matrix[m][n])
Set all the diagonal elements of a matrix with a specified value.
Definition: matrix.c:565
matrix_get_inv_upp_triang
void matrix_get_inv_upp_triang(uint8_t m, uint8_t n, matrix_t U[][n], matrix_t inv_U[][m])
Computes the inverse an upper triangular matrix.
Definition: matrix.c:795
matrix_t
#define matrix_t
Define the data type of the matrix elements.
Definition: matrix.h:38
matrix_part_swap_rows
void matrix_part_swap_rows(uint8_t n, matrix_t matrix[][n], uint8_t i, uint8_t j, uint8_t col_begin, uint8_t col_end)
Swaps two rows of a sub-matrix.
Definition: matrix.c:736
matrix_get_column_vec
void matrix_get_column_vec(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t col_num, matrix_t col_vec[m])
Get a column of a matrix.
Definition: matrix.c:612
matrix_get_abs_max_elem_in_part_column
matrix_t matrix_get_abs_max_elem_in_part_column(uint8_t max_m, uint8_t max_n, matrix_t matrix[max_m][max_n], uint8_t row_num, uint8_t col_num)
Get the maximum absolute value of a column vector in a sub-matrix.
Definition: matrix.c:685
matrix_print
void matrix_print(uint8_t m, uint8_t n, matrix_t matrix[m][n])
Display the values of the matrix elements.
Definition: matrix.c:141
matrix_get_frob_norm
double matrix_get_frob_norm(uint8_t m, uint8_t n, matrix_t A[][n])
Get the Frobenius norm of a matrix.
Definition: matrix.c:782
matrix_in_place_transpose
void matrix_in_place_transpose(uint8_t m, matrix_t matrix[][m])
Computes the in-place transpose of a matrix.
Definition: matrix.c:69
matrix_get_abs_max_elem_and_index_in_part_column
matrix_t matrix_get_abs_max_elem_and_index_in_part_column(uint8_t max_m, uint8_t max_n, matrix_t matrix[max_m][max_n], uint8_t row_num, uint8_t col_num, uint8_t *index)
Get the maximum absolute value and its position in a column vector in a sub-matrix.
Definition: matrix.c:703
matrix_get_max_elem_in_column
matrix_t matrix_get_max_elem_in_column(uint8_t m, uint8_t n, matrix_t matrix[m][n], uint8_t col_num)
Get the largest element of a column vector in a matrix.
Definition: matrix.c:635
matrix_part_copy
void matrix_part_copy(uint8_t m, uint8_t n, matrix_t src_matrix[m][n], uint8_t start_row_ind, uint8_t end_row_ind, uint8_t start_col_ind, uint8_t end_col_ind, uint8_t dest_row_num, uint8_t dest_col_num, matrix_t dest_matrix[][dest_col_num])
Copy a part of a matrix to another matrix or sub-matrix.
Definition: matrix.c:89
matrix_mul
void matrix_mul(uint8_t a_line_num, uint8_t a_col_num, matrix_t a_matrix[a_line_num][a_col_num], uint8_t b_line_num, uint8_t b_col_num, matrix_t b_matrix[b_line_num][b_col_num], matrix_t dest_matrix[a_line_num][b_col_num])
Compute the multiplication of two matrices.
Definition: matrix.c:363
matrix_init
void matrix_init(uint8_t m, uint8_t n, matrix_t matrix[m][n], matrix_t value)
Initialize all the elements of the matrix with a specified value.
Definition: matrix.c:51
matrix_dim_t::col_num
uint8_t col_num
the column number
Definition: matrix.h:62
matrix_get_diag_mat_new
void matrix_get_diag_mat_new(uint8_t m, uint8_t n, matrix_t diag_matrix[m][n], uint8_t length, matrix_t vec[])
Set all the diagonal elements of a matrix with values that are saved in a vector.
Definition: matrix.c:581