Что такое классы матричного и векторного выражений в Boost.uBLAS?

Я пытался читать документацию Boost, но я не понимаю эту концепцию выражения. Класс Matrix наследует класс matrix_expression, я не понимаю, для чего этот класс используется.

Благодарю вас.

1 ответ

Это механизм для сдерживания какого-либо поведения.

matrix_container это - как говорится в слове - контейнер.

matrix_expression является выражением (например, сложение двух матриц). Он основан на идиоме RCTI и помогает в дизайне библиотеки. В качестве примера, скажем, вы хотите написать присвоение объекту класса (функция-член). Предположим, что более простой контекст, чем Ublas, где у вас есть только матричный тип, и вы хотите написать:

template <typename _E>
void assign( _E const & e );

Проблема в том, что тогда вы можете назначить сокет или std::string для матрицы. Как правило, этого пытаются избежать;-)

Итак, лучше написать:

template <typename _E>
void assign( matrix_expression<_E> const & e ) ;

Теперь вы можете назначать только матричные выражения. Я подчеркиваю, что это только логика, а не конкретный дизайн убласа - однако логика всегда такая.

Скажем, теперь вы хотите написать свой собственный оператор *= с двумя матрицами, или с матрицей и выражением, или с двумя выражениями, и, возможно, для *= матрицы вы хотите использовать lapack. Различие между matrix_expression а также matrix_container поможет вам написать специализированные версии этой операции.

PS: я подчеркиваю, это основополагающая логика / мотивация, а не то, что на самом деле происходит. Если вы когда-нибудь углубитесь в внутренности убласа, вы увидите больше того, как используется та же логика.

Другие вопросы по тегам