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

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

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

2

Решение

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

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

2

Другие решения

Других решений пока нет …