Reply to topic

Writing functions which return Eigen types

pjsa
Registered Member
Posts
15
Karma
0
Hi,
I have read the documentation pages "Writing Functions Taking Eigen Types as Parameters" and "Ref< PlainObjectType, Options, StrideType > Class Template Reference" which describe how to define function parameters to avoid evaluation into temporaries.

Are there any similar details that need to be taken care of when writing functions that return eigen types, not a a pass by reference parameter, but as the return type of the function, for example:

MatrixXf cov(const Ref<const MatrixXf>& x, const Ref<const MatrixXf>& y)
{
const float num_observations = static_cast<float>(x.rows());
const RowVectorXf x_mean = x.colwise().sum() / num_observations;
const RowVectorXf y_mean = y.colwise().sum() / num_observations;
return (x.rowwise() - x_mean).transpose() * (y.rowwise() - y_mean) / num_observations;
}

MatrixXf C = cov(a,b) + cov(c,d)

Are cov(a,b) and cov(c,d) evaluated into temporaries and if so what is the recommended procedure to avoid this?
thank you.
Hauke
Registered Member
Posts
109
Karma
3
OS
Hi pjsa,

cov(a,b) and cov(c,d) are evaluated into temporaries because the function returns an actual object (vs. a template expression) by value.

Overcoming this problem is quite difficult. A potential solution might be C++11's trailing return types.

Keep in mind that oftentimes, as for instance in this example, you actually want a temporary. Just consider for a moment, how costly it would be to access a single coefficient of an expression cov(x,y) and how many operations you would be performing redundantly (e.g. the de-meaning) during each access...

Regards,
Hauke

 
Reply to topic

Bookmarks



Who is online

Registered users: Abdelrahman Magdy, Baidu [Spider], Bing [Bot], colomar, cylverbak, edmael, Exabot [Bot], Google [Bot], google01103, jeanliu, ken300, koriun, Majestic-12 [Bot], MSNbot Media, navalgupte, paulus3005, psbot [Picsearch], robinh, scummos, Sentynel, TheraHedwig, tshearer, Uri_Herrera, vascobasque, wolfi323, Yahoo [Bot]