Implementations of matrix multiplication.
Matrix direct multiplication
To multiply two matrices A and B, the number of columns in A is equal to the number of rows in B.
/** * Calculates the direct product of two matrix * @param the first matrix, the second matrix */ void direct_product (matrix expansion, matrix m) { int i,j,k; matrix tmp = (matrix)malloc(sizeof(struct matrix_)); /*Temporary matrix for outer product*/ /*Space allocation for tmp matrix*/ int rows = expansion->rows, cols = expansion->cols; allocate_matrix (tmp, rows, cols); /*End space allocation for tmp wire*/ copy (tmp, expansion); printf("\nCurrent matrix rows: %d, cols: %d\n", tmp->rows, tmp->cols); display(tmp); printf("\nDirect product by matrix m rows: %d, cols: %d\n", m->rows, m->cols); display(m); if(tmp->cols != m->rows) { printf("Direct product not possible: row | col mismatch\n"); exit(0); } for (i=0; i<tmp->rows; i++) for(j=0; j<m->cols; j++) { expansion->dat[i][j]=0; for(k=0; k<tmp->cols; k++) expansion->dat[i][j]+= tmp->dat[i][k]*m->dat[k][j]; } expansion->rows = tmp->rows; //Update new expansion matrix size expansion->cols = m->cols; //Update new expansion matrix size printf("\nResulting direct matrix rows: %d, cols: %d\n",expansion->rows, expansion->cols); display(expansion); free_matrix (tmp, rows); }
Matrix outer product
To multiply two matrices A and B, the number of columns in A is equal to the number of rows in B.
/** * Calculates the outer product of two matrix * @param the first matrix, the second matrix */ void outer_product (matrix expansion, matrix m) { int i,j,k,l; matrix tmp = (matrix)malloc(sizeof(struct matrix_)); /*Temporary matrix for outer product*/ /*Space allocation for tmp matrix*/ int rows = expansion->rows, cols = expansion->cols; allocate_matrix (tmp, rows, cols); /*End space allocation for tmp wire*/ copy (tmp, expansion); /*Copy the current expansion matrix in a temporary matrix*/ printf("\nCurrent matrix rows: %d, cols: %d\n", tmp->rows, tmp->cols); display(tmp); printf("\nOuter product by matrix m rows: %d, cols: %d\n", m->rows, m->cols); display(m); /*Outer product operation*/ for (i=0; i<tmp->rows; i++) { for (j=0; j<tmp->cols; j++) { for (k=m->rows*i; k<(m->rows*i)+m->rows; k++) { for (l=m->cols*j; l<(m->cols*j)+m->cols; l++) { expansion->dat[k][l] = m->dat[k-(m->rows*i)][l-(m->cols*j)] * tmp->dat[i][j]; } } } } expansion->rows = tmp->rows * m->rows; //Update new expansion matrix size expansion->cols = tmp->cols * m->cols; //Update new expansion matrix size printf("\nResulting outer product matrix rows: %d, cols: %d\n",expansion->rows, expansion->cols); display(expansion); free_matrix (tmp, rows); }