Here are three functions that apply the same operation to all components of a matrix:
template <
typename oper,
typename compo_a,
typename alloc_a = std::allocator <compo_a> >
void alone_non_var (
var_matrix_base<compo_a,alloc_a> const & mat_a
);
template <
typename oper,
typename compo_a,
typename alloc_a = std::allocator <compo_a>
> var_matrix <compo_a,alloc_a> alone_ret_var (
var_matrix_base<compo_a,alloc_a> const & mat_a
);
template <
typename oper,
typename compo_a,
typename compo_z = compo_a,
typename alloc_a = std::allocator <compo_a>,
typename alloc_z = std::allocator <compo_z>
> var_matrix<compo_z,alloc_z> alone_ret_con (
sub_matrix_base<compo_a,alloc_a> const & mat_a
);
As an example, this program:
#include "SOME_DIRECTORY/mat_gen_dim.h"
using namespace mat_gen_dim;
form const frm {blt{1,3},blt{2,6},blt{5,7}};
int main () {
std::cout.setf (std::ios::fixed, std::ios::floatfield);
std::cout.precision (3);
{
struct neg_non_var {
void operator() (double & a) { a = -a; }
};
cout << "\n\n -- negate a matrix, return nothing ";
var_matrix<double> mat_a1 {sub_matrix_linear (frm, 1.0)};
cout << "\n mat_a1 before: " << mat_a1;
alone_non_var <neg_non_var,double> (mat_a1);
cout << "\n mat_a1 after: " << mat_a1;
} {
struct neg_ret_var {
double operator() (double & a) { return a = -a; }
};
cout << "\n\n -- negate a matrix, and return a copy of it ";
var_matrix<double> mat_a2 {sub_matrix_linear (frm, 1.0)};
cout << "\n mat_a2 before: " << mat_a2;
con_matrix<double> mat_z2 {
alone_ret_var <neg_ret_var,double> (mat_a2)
};
cout << "\n mat_a2 after: " << mat_a2;
cout << "\n mat_z2 == what is returned: " << mat_z2;
} {
struct neg_ret_con {
double operator() (double const a) { return -a; }
};
cout << "\n\n -- negate a copy of a matrix, and return that copy ";
con_matrix<double> mat_a3 {sub_matrix_linear (frm, 1.0)};
cout << "\n mat_a3 before: " << mat_a3;
con_matrix<double> mat_z3 {
alone_ret_con <neg_ret_con,double> (mat_a3)
};
cout << "\n mat_a3 after: " << mat_a3;
cout << "\n mat_z3 == what is returned: " << mat_z3;
}
return 0;
}
yields this output:
-- negate a matrix, return nothing
mat_a1 before:
( 1 2 5 ) = 1.125 ( 1 2 6 ) = 1.126 ( 1 3 5 ) = 1.135 ( 1 3 6 ) = 1.136
( 1 4 5 ) = 1.145 ( 1 4 6 ) = 1.146 ( 1 5 5 ) = 1.155 ( 1 5 6 ) = 1.156
( 2 2 5 ) = 1.225 ( 2 2 6 ) = 1.226 ( 2 3 5 ) = 1.235 ( 2 3 6 ) = 1.236
( 2 4 5 ) = 1.245 ( 2 4 6 ) = 1.246 ( 2 5 5 ) = 1.255 ( 2 5 6 ) = 1.256
mat_a1 after:
( 1 2 5 ) = -1.125 ( 1 2 6 ) = -1.126 ( 1 3 5 ) = -1.135 ( 1 3 6 ) = -1.136
( 1 4 5 ) = -1.145 ( 1 4 6 ) = -1.146 ( 1 5 5 ) = -1.155 ( 1 5 6 ) = -1.156
( 2 2 5 ) = -1.225 ( 2 2 6 ) = -1.226 ( 2 3 5 ) = -1.235 ( 2 3 6 ) = -1.236
( 2 4 5 ) = -1.245 ( 2 4 6 ) = -1.246 ( 2 5 5 ) = -1.255 ( 2 5 6 ) = -1.256
-- negate a matrix, and return a copy of it
mat_a2 before:
( 1 2 5 ) = 1.125 ( 1 2 6 ) = 1.126 ( 1 3 5 ) = 1.135 ( 1 3 6 ) = 1.136
( 1 4 5 ) = 1.145 ( 1 4 6 ) = 1.146 ( 1 5 5 ) = 1.155 ( 1 5 6 ) = 1.156
( 2 2 5 ) = 1.225 ( 2 2 6 ) = 1.226 ( 2 3 5 ) = 1.235 ( 2 3 6 ) = 1.236
( 2 4 5 ) = 1.245 ( 2 4 6 ) = 1.246 ( 2 5 5 ) = 1.255 ( 2 5 6 ) = 1.256
mat_a2 after:
( 1 2 5 ) = -1.125 ( 1 2 6 ) = -1.126 ( 1 3 5 ) = -1.135 ( 1 3 6 ) = -1.136
( 1 4 5 ) = -1.145 ( 1 4 6 ) = -1.146 ( 1 5 5 ) = -1.155 ( 1 5 6 ) = -1.156
( 2 2 5 ) = -1.225 ( 2 2 6 ) = -1.226 ( 2 3 5 ) = -1.235 ( 2 3 6 ) = -1.236
( 2 4 5 ) = -1.245 ( 2 4 6 ) = -1.246 ( 2 5 5 ) = -1.255 ( 2 5 6 ) = -1.256
mat_z2 == what is returned:
( 1 2 5 ) = -1.125 ( 1 2 6 ) = -1.126 ( 1 3 5 ) = -1.135 ( 1 3 6 ) = -1.136
( 1 4 5 ) = -1.145 ( 1 4 6 ) = -1.146 ( 1 5 5 ) = -1.155 ( 1 5 6 ) = -1.156
( 2 2 5 ) = -1.225 ( 2 2 6 ) = -1.226 ( 2 3 5 ) = -1.235 ( 2 3 6 ) = -1.236
( 2 4 5 ) = -1.245 ( 2 4 6 ) = -1.246 ( 2 5 5 ) = -1.255 ( 2 5 6 ) = -1.256
-- negate a copy of a matrix, and return that copy
mat_a3 before:
( 1 2 5 ) = 1.125 ( 1 2 6 ) = 1.126 ( 1 3 5 ) = 1.135 ( 1 3 6 ) = 1.136
( 1 4 5 ) = 1.145 ( 1 4 6 ) = 1.146 ( 1 5 5 ) = 1.155 ( 1 5 6 ) = 1.156
( 2 2 5 ) = 1.225 ( 2 2 6 ) = 1.226 ( 2 3 5 ) = 1.235 ( 2 3 6 ) = 1.236
( 2 4 5 ) = 1.245 ( 2 4 6 ) = 1.246 ( 2 5 5 ) = 1.255 ( 2 5 6 ) = 1.256
mat_a3 after:
( 1 2 5 ) = 1.125 ( 1 2 6 ) = 1.126 ( 1 3 5 ) = 1.135 ( 1 3 6 ) = 1.136
( 1 4 5 ) = 1.145 ( 1 4 6 ) = 1.146 ( 1 5 5 ) = 1.155 ( 1 5 6 ) = 1.156
( 2 2 5 ) = 1.225 ( 2 2 6 ) = 1.226 ( 2 3 5 ) = 1.235 ( 2 3 6 ) = 1.236
( 2 4 5 ) = 1.245 ( 2 4 6 ) = 1.246 ( 2 5 5 ) = 1.255 ( 2 5 6 ) = 1.256
mat_z3 == what is returned:
( 1 2 5 ) = -1.125 ( 1 2 6 ) = -1.126 ( 1 3 5 ) = -1.135 ( 1 3 6 ) = -1.136
( 1 4 5 ) = -1.145 ( 1 4 6 ) = -1.146 ( 1 5 5 ) = -1.155 ( 1 5 6 ) = -1.156
( 2 2 5 ) = -1.225 ( 2 2 6 ) = -1.226 ( 2 3 5 ) = -1.235 ( 2 3 6 ) = -1.236
( 2 4 5 ) = -1.245 ( 2 4 6 ) = -1.246 ( 2 5 5 ) = -1.255 ( 2 5 6 ) = -1.256