|
Ublas : |
From: Gunter Winkler (guwi17_at_[hidden])
Date: 2006-11-20 05:37:01
On Sunday 19 November 2006 00:13, Manoj Rajagopalan wrote:
> template<typename E>
> void initialize(matrix_expression<E> A,
> typename E::value_type const& value)
> {
> ...
> }
Dealing with matrix expression directly is tricky, because of the CRTP usage.
1) You always have to use references to a matrix_expression as function
parameter, because the (default) copy constructor of matrix_expression does
not copy anything. (matrix_expression has no member variables and thus its
size is zero!)
template<typename E>
void initialize(matrix_expression<E>& A,
typename E::value_type const& value)
{
E& A_ref = A(); // this is the "official" way (just hiding the cast)
A_ref = scalar_matrix<typename E::value_type>(A_ref.size1(), A_ref.size2(),
value);
}
2) Sometimes you have to explicitly create instances (because you need
something to refer to and you can't have a direct instance of a
matrix_expression<X>)
matrix_range< matrix<int> > sub_A(A,range(1,3),range(1,3));
initialize(sub_A, 8);
In short:
Never instantiate matrix_expression because it contains no data.
Longer:
matrix_expression exists only because you need some common type
for all expressions. The price you pay is to use references everywhere.
mfg
Gunter