mat_gen_dim section 8F.
home

This sample program shows how ordinary matrix multiplication as can be implemented in mat_gen_dim. Note that the second blt of the first matrix must equal the first blt of the second matrix.

#include "SOME_DIRECTORY/mat_gen_dim.h"
using namespace mat_gen_dim;

template <typename compo, typename alloc>
var_matrix<compo,alloc> ordinary_matrix_mult (
    sub_matrix_base<compo,alloc> const & mat_a,
    sub_matrix_base<compo,alloc> const & mat_b
) {
    vec_bool const which {false,true,true,false};

    struct mul {
        compo operator() (compo const a, compo const b) { return a * b; }
    };

    struct add_asgn {
        compo operator() (compo & z, compo const y) { return z += y; }
    };

    return inner_product<mul,add_asgn> (mat_a, mat_b, which);
}

int main () {
    form const frm_a {blt{1,3},blt{1,4}};

    con_matrix<int> mat_a (frm_a, {
        2,  3, -1,
        4, -2,  5
    } );
    cout << "\n mat_a: " << mat_a;

    form const frm_b {blt{1,4},blt{1,5}};
    con_matrix<int> mat_b (frm_b, {
        2, -1,  0,  6,
        1,  3, -5,  1,
        4,  1, -2,  2
    } );
    cout << "\n mat_b: " << mat_b;

    con_matrix<int> mat_c (ordinary_matrix_mult (mat_a, mat_b));
    cout << "\n mat_a times mat_b: " << mat_c;

    cout << "\n\n now transpose everything: \n";

    permu const p10 {1, 0};

    con_lens_permu_form<int> tam_b (mat_b, p10);
    cout << "\n tam_b: " << tam_b;

    con_lens_permu_form<int> tam_a (mat_a, p10);
    cout << "\n tam_a: " << tam_a;

    con_matrix<int> tam_c (ordinary_matrix_mult (tam_b, tam_a));
    cout << "\n tam_b times tam_a: " << tam_c;

    return 0;
}
yields this output:
 mat_a: 
    ( 1 1 ) =   2     ( 1 2 ) =   3     ( 1 3 ) =  -1 
    ( 2 1 ) =   4     ( 2 2 ) =  -2     ( 2 3 ) =   5 
 mat_b: 
    ( 1 1 ) =   2     ( 1 2 ) =  -1     ( 1 3 ) =   0     ( 1 4 ) =   6 
    ( 2 1 ) =   1     ( 2 2 ) =   3     ( 2 3 ) =  -5     ( 2 4 ) =   1 
    ( 3 1 ) =   4     ( 3 2 ) =   1     ( 3 3 ) =  -2     ( 3 4 ) =   2 
 mat_a times mat_b: 
    ( 1 1 ) =   3     ( 1 2 ) =   6     ( 1 3 ) = -13     ( 1 4 ) =  13 
    ( 2 1 ) =  26     ( 2 2 ) =  -5     ( 2 3 ) =   0     ( 2 4 ) =  32 

 now transpose everything: 

 tam_b: 
    ( 1 1 ) =   2     ( 1 2 ) =   1     ( 1 3 ) =   4 
    ( 2 1 ) =  -1     ( 2 2 ) =   3     ( 2 3 ) =   1 
    ( 3 1 ) =   0     ( 3 2 ) =  -5     ( 3 3 ) =  -2 
    ( 4 1 ) =   6     ( 4 2 ) =   1     ( 4 3 ) =   2 
 tam_a: 
    ( 1 1 ) =   2     ( 1 2 ) =   4 
    ( 2 1 ) =   3     ( 2 2 ) =  -2 
    ( 3 1 ) =  -1     ( 3 2 ) =   5 
 tam_b times tam_a: 
    ( 1 1 ) =   3     ( 1 2 ) =  26 
    ( 2 1 ) =   6     ( 2 2 ) =  -5 
    ( 3 1 ) = -13     ( 3 2 ) =   0 
    ( 4 1 ) =  13     ( 4 2 ) =  32