2013-04-14 4 views
1

Я использую собственную библиотеку линейных алгебр C++. Я попытался умножать 2 матрицы:Как преобразовать ProductReturnType в матрицу?

static void do_stuff_with_matrix(Eigen::MatrixXf& mat) { 
    return; 
} 

Eigen::MatrixXf a(3, 4); 
Eigen::MatrixXf b(4, 5); 

Eigen::MatrixXf c = a * b; 
do_stuff_with_matrix(c); 

К сожалению, я получаю ошибку компилятора о том, что ProductReturnType (который c есть) не может быть преобразован в Eigen::MatrixXf&. Как выполнить это преобразование?

+0

Вы можете отправить свою функцию перегрузки оператора '*'? так что легко найти ошибку. –

+0

Спасибо, какая функция перегрузки оператора '' * '? – dangerChihuahua007

+0

Eigen :: MatrixXf c = a * b; Для матричных умножений вы должны перегрузить оператор '*'. Я думаю, что вы внедрили эту функцию. поэтому, пожалуйста, загрузите эту функцию. –

ответ

2

Eigen использует ленивую оценку, чтобы предотвратить ненужные временные и другие вещи. В результате c по существу ProductReturnType, оптимизированная структура матричного продукта: класс

template<typename Lhs, typename Rhs, int ProductType> 
class Eigen::ProductReturnType< Lhs, Rhs, ProductType > 

Helper, чтобы получить корректный и оптимизированный возвращаемый тип operator*. [Смотрите также 2]

Для того, чтобы создать реальную матрицу из выражения вида A * B вам нужно оценить его непосредственно:

Eigen::MatrixXf c = (a * b).eval(); 
do_stuff_with_matrix(c); 

См this page для получения дополнительной информации о ленивой оценке и ступенчатости Эйгена в ,

+0

+1 Спасибо за эту ссылку! –