Eigen::Ref
template<typename PlainObjectType, int Options, typename StrideType>
class Eigen::Ref< PlainObjectType, Options, StrideType >
Матричное или векторное выражение, отображающее существующее выражение.
- Шаблочные параметры
-
PlainObjectType эквивалентный тип матрицы отображаемых данных Options указывают выравнивание указателя в байтах. Может принимать значения: Aligned128, ,Aligned64,Aligned32,Aligned16,Aligned8илиUnaligned. По умолчаниюUnaligned.StrideType необязательно указывает шаги. По умолчанию Ref подразумевает непрерывное хранение по внутренней размерности (внутренний шаг == 1), но принимает переменный внешний шаг (ведущая размерность). Это можно переопределить, указав шаги. Передаваемый здесь тип должен быть специализацией шаблона Stride, см. примеры ниже.
Этот класс предоставляет способ написания функций без шаблонов, принимающих объекты Eigen в качестве параметров, при этом ограничивая количество копий. Объект Ref<> может представлять либо константное выражение, либо l-значение:
// in-out argument: void foo1(Ref<VectorXf> x); // read-only const argument: void foo2(const Ref<const VectorXf>& x);
В случае ввода/вывода аргумент ввода должен удовлетворять ограничениям фактического типа Ref<>, в противном случае возникнет проблема компиляции. По умолчанию Ref<VectorXf> может ссылаться на любое плотное векторное выражение с плавающей точкой, имеющее непрерывную структуру памяти. Аналогично, Ref<MatrixXf> может ссылаться на любое плотное матричное выражение в столбцовом порядке с плавающей точкой, элементы столбцов которого непрерывно хранятся с возможностью наличия постоянного пространства между каждым столбцом, т.е. внутренний шаг должен быть равен 1, но внешний шаг (или ведущая размерность) может быть больше числа строк.
В константном случае, если входное выражение не соответствует вышеуказанному требованию, оно оценивается как временное перед передачей в функцию. Вот несколько примеров:
MatrixXf A; VectorXf a; foo1(a.head()); // OK foo1(A.col()); // OK foo1(A.row()); // Compilation error because here innerstride!=1 foo2(A.row()); // Compilation error because A.row() is a 1xN object while foo2 is expecting a Nx1 object foo2(A.row().transpose()); // The row is copied into a contiguous temporary foo2(2*a); // The expression is evaluated into a temporary foo2(A.col().segment(2,4)); // No temporary
Диапазон вводимых данных, на которые можно ссылаться без временных объектов, можно расширить, используя два последних шаблонных параметра. Вот пример, принимающий innerstride!=1:
// in-out argument: void foo3(Ref<VectorXf,0,InnerStride<> > x); foo3(A.row()); // OK
Недостатком здесь является то, что функция foo3 может быть значительно медленнее, чем foo1, потому что она не сможет использовать векторизацию и будет включать более дорогостоящие вычисления адресов, даже если входные данные непрерывно хранятся в памяти. Для решения этой проблемы можно предложить перегрузку, внутренне вызывающую шаблонную функцию, например:
// in the .h: void foo(const Ref<MatrixXf>& A); void foo(const Ref<MatrixXf,0,Stride<> >& A); // in the .cpp: template<typename TypeOfA> void foo_impl(const TypeOfA& A) { ... // crazy code goes here } void foo(const Ref<MatrixXf>& A) { foo_impl(A); } void foo(const Ref<MatrixXf,0,Stride<> >& A) { foo_impl(A); }
См. также следующие вопросы на stackoverflow для получения дополнительной информации:
- См. также
- PlainObjectBase::Map(), Порядки хранения
Наследует Eigen::RefBase< Derived >.
| template<typename Derived > | |
| Ref (DenseBase< Derived > &expr) | |
Ref()
| inline |
Неявный конструктор из любого плотного выражения
Документация для этого класса была сгенерирована из следующего файла:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1Ref.html