Что такое классы матричного и векторного выражений в 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: я подчеркиваю, это основополагающая логика / мотивация, а не то, что на самом деле происходит. Если вы когда-нибудь углубитесь в внутренности убласа, вы увидите больше того, как используется та же логика.