mat_gen_dim section 8B.
home

This function calculates the outer product of two matrices. If mat_a has p dimensions and mat_b has q dimensions, then their outer product mat_y has p + q dimensions. In detail:

where multiplication is according to whatever function object is supplied. Here is the signature of outer_product:
template <
    typename mul_oper,
    typename compo_a,
    typename compo_b = compo_a,
    typename compo_y = compo_a,
    typename alloc_a = std::allocator <compo_a>,
    typename alloc_b = std::allocator <compo_b>,
    typename alloc_y = std::allocator <compo_y>
> var_matrix<compo_y,alloc_y> outer_product (
    sub_matrix_base<compo_a,alloc_a> const & mat_a,
    sub_matrix_base<compo_b,alloc_b> const & mat_b
);
As an example, this program:
#include "SOME_DIRECTORY/mat_gen_dim.h"
using namespace mat_gen_dim;

form const frm_a {blt{3,5},blt{3,6},blt{5,7}};
form const frm_b {blt{2,4},blt{1,3}};

struct mul_double {
    double operator() (double const a, double const b) { return a * b; }
};

int main() {
    cout.setf (std::ios::fixed, std::ios::floatfield);

    cout.precision (3);
    var_matrix<double> mat_a {sub_matrix_linear (frm_a,1.0)};
    cout << "\n matrix a: " << mat_a;
    con_matrix<double> mat_acon {mat_a};

    cout.precision (2);
    var_matrix<double> mat_b {sub_matrix_linear (frm_b,2.0)};
    cout << "\n matrix b: " << mat_b;
    con_matrix<double> mat_bcon {mat_b};

    cout.precision (5);
    var_matrix<double> const mat_y { outer_product<mul_double> (mat_a, mat_bcon) };
    cout << "\n outer product of a and b: " << mat_y;
    con_matrix<double> mat_ycon {mat_y};

    return 0;
}
yields this output:
 matrix a: 
    ( 3 3 5 ) = 1.335    ( 3 3 6 ) = 1.336    ( 3 4 5 ) = 1.345    ( 3 4 6 ) = 1.346
    ( 3 5 5 ) = 1.355    ( 3 5 6 ) = 1.356    ( 4 3 5 ) = 1.435    ( 4 3 6 ) = 1.436
    ( 4 4 5 ) = 1.445    ( 4 4 6 ) = 1.446    ( 4 5 5 ) = 1.455    ( 4 5 6 ) = 1.456
 matrix b: 
    ( 2 1 ) = 2.21    ( 2 2 ) = 2.22    ( 3 1 ) = 2.31    ( 3 2 ) = 2.32
 outer product of a and b: 
    ( 3 3 5 2 1 ) = 2.95035    ( 3 3 5 2 2 ) = 2.96370    ( 3 3 5 3 1 ) = 3.08385    ( 3 3 5 3 2 ) = 3.09720
    ( 3 3 6 2 1 ) = 2.95256    ( 3 3 6 2 2 ) = 2.96592    ( 3 3 6 3 1 ) = 3.08616    ( 3 3 6 3 2 ) = 3.09952
    ( 3 4 5 2 1 ) = 2.97245    ( 3 4 5 2 2 ) = 2.98590    ( 3 4 5 3 1 ) = 3.10695    ( 3 4 5 3 2 ) = 3.12040
    ( 3 4 6 2 1 ) = 2.97466    ( 3 4 6 2 2 ) = 2.98812    ( 3 4 6 3 1 ) = 3.10926    ( 3 4 6 3 2 ) = 3.12272
    ( 3 5 5 2 1 ) = 2.99455    ( 3 5 5 2 2 ) = 3.00810    ( 3 5 5 3 1 ) = 3.13005    ( 3 5 5 3 2 ) = 3.14360
    ( 3 5 6 2 1 ) = 2.99676    ( 3 5 6 2 2 ) = 3.01032    ( 3 5 6 3 1 ) = 3.13236    ( 3 5 6 3 2 ) = 3.14592
    ( 4 3 5 2 1 ) = 3.17135    ( 4 3 5 2 2 ) = 3.18570    ( 4 3 5 3 1 ) = 3.31485    ( 4 3 5 3 2 ) = 3.32920
    ( 4 3 6 2 1 ) = 3.17356    ( 4 3 6 2 2 ) = 3.18792    ( 4 3 6 3 1 ) = 3.31716    ( 4 3 6 3 2 ) = 3.33152
    ( 4 4 5 2 1 ) = 3.19345    ( 4 4 5 2 2 ) = 3.20790    ( 4 4 5 3 1 ) = 3.33795    ( 4 4 5 3 2 ) = 3.35240
    ( 4 4 6 2 1 ) = 3.19566    ( 4 4 6 2 2 ) = 3.21012    ( 4 4 6 3 1 ) = 3.34026    ( 4 4 6 3 2 ) = 3.35472
    ( 4 5 5 2 1 ) = 3.21555    ( 4 5 5 2 2 ) = 3.23010    ( 4 5 5 3 1 ) = 3.36105    ( 4 5 5 3 2 ) = 3.37560
    ( 4 5 6 2 1 ) = 3.21776    ( 4 5 6 2 2 ) = 3.23232    ( 4 5 6 3 1 ) = 3.36336    ( 4 5 6 3 2 ) = 3.37792