Matrix multiplication

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);
}
Scroll to Top