uz_matrix_sum

Calculates \(\boldsymbol{C}=\boldsymbol{A} + \boldsymbol{B}\) if dimensions of \(\boldsymbol{A}\), \(\boldsymbol{B}\) and \(\boldsymbol{C}\) are equal.

Warning

Do not call this function with A and B having the same pointer to prevent aliasing issues.

void uz_matrix_sum(uz_matrix_t const *const A, uz_matrix_t const *const B, uz_matrix_t *const C_out)

Calculates C_out = A + B.

Parameters:
  • A – Pointer to a uz_matrix_t instance

  • B – Pointer to a uz_matrix_t instance

  • C_out – Sum of A and B is written to C_out

Example

\[\begin{split}\begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix} + \begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix} = \begin{bmatrix} 2 & 4\\ 6 & 8 \end{bmatrix}\end{split}\]
 1#ifdef TEST
 2
 3#include "unity.h"
 4#include "test_assert_with_exception.h"
 5#include "uz_matrix.h"
 6#include "uz_matrix_init_helper.h"
 7
 8void setUp(void)
 9{
10}
11
12void tearDown(void)
13{
14}
15
16void test_uz_matrix_matrix_add_column_vector(void){
17    uint32_t rows=1;
18    uint32_t columns=4;
19    float A_data[4]={1,2,3,4};
20    float B_data[4]={1,2,3,4};
21    float C_data[4]={113};
22    uz_matrix_t* A=init_array_test_helper(A_data,UZ_MATRIX_SIZE(A_data),rows, columns );
23    uz_matrix_t* B=init_array_test_helper(B_data,UZ_MATRIX_SIZE(B_data),rows, columns );
24    uz_matrix_t* C=init_array_test_helper(C_data,UZ_MATRIX_SIZE(C_data),rows, columns );
25    // C=A + B
26    uz_matrix_sum(A,B, C);
27    TEST_ASSERT_EQUAL_FLOAT(2,uz_matrix_get_element_zero_based(C,0,0));
28    TEST_ASSERT_EQUAL_FLOAT(4,uz_matrix_get_element_zero_based(C,0,1));
29    TEST_ASSERT_EQUAL_FLOAT(6,uz_matrix_get_element_zero_based(C,0,2));
30    TEST_ASSERT_EQUAL_FLOAT(8,uz_matrix_get_element_zero_based(C,0,3));
31}
32
33void test_uz_matrix_matrix_add_row_vector(void){
34    uint32_t rows=4;
35    uint32_t columns=1;
36    float A_data[4]={1,2,3,4};
37    float B_data[4]={1,2,3,4};
38    float C_data[4]={1523};
39    uz_matrix_t* A=init_array_test_helper(A_data,UZ_MATRIX_SIZE(A_data),rows, columns );
40    uz_matrix_t* B=init_array_test_helper(B_data,UZ_MATRIX_SIZE(B_data),rows, columns );
41    uz_matrix_t* C=init_array_test_helper(C_data,UZ_MATRIX_SIZE(C_data),rows, columns );
42    // C=A + B
43    uz_matrix_sum(A,B, C);
44    TEST_ASSERT_EQUAL_FLOAT(2,uz_matrix_get_element_zero_based(C,0,0) );
45    TEST_ASSERT_EQUAL_FLOAT(4,uz_matrix_get_element_zero_based(C,1,0) );
46    TEST_ASSERT_EQUAL_FLOAT(6,uz_matrix_get_element_zero_based(C,2,0) );
47    TEST_ASSERT_EQUAL_FLOAT(8,uz_matrix_get_element_zero_based(C,3,0) );
48}
49
50void test_uz_matrix_matrix_add_2_times2(void){
51    uint32_t rows=2;
52    uint32_t columns=2;
53    float A_data[4]={1,2,3,4};
54    float B_data[4]={1,2,3,4};
55    float C_data[4]={4286};
56    uz_matrix_t* A=init_array_test_helper(A_data,UZ_MATRIX_SIZE(A_data),rows, columns );
57    uz_matrix_t* B=init_array_test_helper(B_data,UZ_MATRIX_SIZE(B_data),rows, columns );
58    uz_matrix_t* C=init_array_test_helper(C_data,UZ_MATRIX_SIZE(C_data),rows, columns );
59    // C=A + B
60    uz_matrix_sum(A,B, C);
61    TEST_ASSERT_EQUAL_FLOAT(2,uz_matrix_get_element_zero_based(C,0,0) );
62    TEST_ASSERT_EQUAL_FLOAT(4,uz_matrix_get_element_zero_based(C,0,1) );
63    TEST_ASSERT_EQUAL_FLOAT(6,uz_matrix_get_element_zero_based(C,1,0) );
64    TEST_ASSERT_EQUAL_FLOAT(8,uz_matrix_get_element_zero_based(C,1,1) );
65}
66
67#endif // TEST