Spec-Zone.ru › Eigen3

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 для получения дополнительной информации:

  • Правильное использование класса Eigen::Ref<>
См. также
PlainObjectBase::Map(), Порядки хранения

Наследует Eigen::RefBase< Derived >.

template<typename Derived >
Ref (DenseBase< Derived > &expr)

Ref()

template<typename PlainObjectType , int Options, typename StrideType >
template<typename Derived >
Eigen::Ref< PlainObjectType, Options, StrideType >::Ref ( DenseBase< Derived > & expr )
inline

Неявный конструктор из любого плотного выражения


Документация для этого класса была сгенерирована из следующего файла:
  • Ref.h

© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1Ref.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API