matrix_multiply#
Matrix multiplication \(\boldsymbol{C}=\boldsymbol{A} \boldsymbol{B}\) of the matrix \(\boldsymbol{A}\) with dimension \(m \times n\) and \(\boldsymbol{B}\) with dimension \(n \times p\) results in matrix \(\boldsymbol{C}\) with dimension \(m \times p\). For matrix multiplication, the number of columns \(n\) in \(\boldsymbol{A}\) must be equal to the number of rows of matrix \(\boldsymbol{B}\).
\[\boldsymbol{C}=\boldsymbol{A} \boldsymbol{B}\]
\[\begin{split} \begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1n} \\
a_{21} & a_{22} & \cdots & a_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
a_{m1} & a_{m2} & \cdots & a_{mn}
\end{bmatrix}
\begin{bmatrix}
b_{11} & b_{12} & \cdots & b_{1p} \\
b_{21} & b_{22} & \cdots & b_{2p} \\
\vdots & \vdots & \ddots & \vdots \\
b_{n1} & b_{n2} & \cdots & b_{np}
\end{bmatrix}
=
\begin{bmatrix}
c_{11} & c_{12} & \cdots & c_{1p} \\
c_{21} & c_{22} & \cdots & c_{2p} \\
\vdots & \vdots & \ddots & \vdots \\
c_{m1} & c_{m2} & \cdots & c_{mp}
\end{bmatrix}\end{split}\]
-
void uz_matrix_multiply(uz_matrix_t const *const A, uz_matrix_t const *const B, uz_matrix_t *const C_out)#
Calculates the “real” matrix multiplication C_out=A * B.
- Parameters:
A – Pointer to a uz_matrix_t instance
B – Pointer to a uz_matrix_t instance
C_out – Result of the multiplication is written to C_out
Example#
\[\begin{split}\begin{bmatrix}
1 & 2\\
3 & 4 \\
5 & 6
\end{bmatrix}
\begin{bmatrix}
2 & 1\\
8 & 5
\end{bmatrix} =
\begin{bmatrix}
18 & 11\\
38 & 23\\
58 & 35
\end{bmatrix}\end{split}\]
void test_uz_matrix_matrix_multiply(void){
float A_data[6]={1,2,3,4,5,6};
float B_data[4]={2,1,8,5};
float C_data[6]={5};
struct uz_matrix_t A_matrix = {0};
struct uz_matrix_t B_matrix = {0};
struct uz_matrix_t C_matrix = {0};
uz_matrix_t* A=uz_matrix_init(&A_matrix,A_data,UZ_MATRIX_SIZE(A_data),3, 2 );
TEST_ASSERT_EQUAL_FLOAT(1,get_matrix_element_zero_based(A,0,0));
TEST_ASSERT_EQUAL_FLOAT(2,get_matrix_element_zero_based(A,0,1));
TEST_ASSERT_EQUAL_FLOAT(3,get_matrix_element_zero_based(A,1,0));
uz_matrix_t* B=uz_matrix_init(&B_matrix,B_data,UZ_MATRIX_SIZE(B_data),2, 2 );
uz_matrix_t* C=uz_matrix_init(&C_matrix,C_data,UZ_MATRIX_SIZE(C_data),3, 2 );
// C=A * B
matrix_multiply(A,B, C);
TEST_ASSERT_EQUAL_FLOAT(18,get_matrix_element_zero_based(C,0,0) );
TEST_ASSERT_EQUAL_FLOAT(11,get_matrix_element_zero_based(C,0,1) );
TEST_ASSERT_EQUAL_FLOAT(38,get_matrix_element_zero_based(C,1,0) );
TEST_ASSERT_EQUAL_FLOAT(23,get_matrix_element_zero_based(C,1,1) );
TEST_ASSERT_EQUAL_FLOAT(58,get_matrix_element_zero_based(C,2,0) );
TEST_ASSERT_EQUAL_FLOAT(35,get_matrix_element_zero_based(C,2,1) );
}