Флаги
Это возможные биты, которые можно объединить OR, чтобы составить флаги матрицы или выражения.
Важно отметить, что эти флаги — это чисто понятие времени компиляции. Они являются свойством типа выражения на этапе компиляции, реализованным в виде перечислений. Они не хранятся в памяти во время выполнения и не приводят к никакой задержке во время выполнения.
- См. также
- MatrixBase::Flags
| const unsigned int | Eigen::ActualPacketAccessBit |
| EIGEN_DEPRECATED const unsigned int | Eigen::AlignedBit |
| const unsigned int | Eigen::CompressedAccessBit |
| const unsigned int | Eigen::DirectAccessBit |
| EIGEN_DEPRECATED const unsigned int | Eigen::EvalBeforeAssigningBit |
| const unsigned int | Eigen::EvalBeforeNestingBit |
| const unsigned int | Eigen::LinearAccessBit |
| const unsigned int | Eigen::LvalueBit |
| const unsigned int | Eigen::NoPreferredStorageOrderBit |
| const unsigned int | Eigen::PacketAccessBit |
| const unsigned int | Eigen::RowMajorBit |
ActualPacketAccessBit
| const unsigned int Eigen::ActualPacketAccessBit |
Если векторизация включена (EIGEN_VECTORIZE определено), эта константа устанавливается в значение PacketAccessBit.
Если векторизация не включена (EIGEN_VECTORIZE не определено), эта константа устанавливается в значение 0.
AlignedBit
| EIGEN_DEPRECATED const unsigned int Eigen::AlignedBit |
означает, что первый пакет коэффициентов гарантированно выровнен. Выражение не может иметь флаг AlignedBit без флага PacketAccessBit. Другими словами, это означает, что мы можем выполнить выровненное обращение к пакету первого элемента независимо от типа выражения:
expression.packet<Aligned>(0);
CompressedAccessBit
| const unsigned int Eigen::CompressedAccessBit |
Означает, что к базовым коэффициентам можно получить доступ через указатели к разреженной (не)сжатой структуре хранения, то есть выражение предоставляет:
inline const Scalar* valuePtr() const; inline const Index* innerIndexPtr() const; inline const Index* outerIndexPtr() const; inline const Index* innerNonZeroPtr() const;
DirectAccessBit
| const unsigned int Eigen::DirectAccessBit |
Означает, что к базовому массиву коэффициентов можно получить прямой доступ как к обычному массиву со смещением. Структура памяти массива коэффициентов должна точно соответствовать естественной структуре, предполагаемой функциями rows(), cols(), outerStride(), innerStride() и RowMajorBit. Это исключает выражения, такие как Diagonal, коэффициенты которых, хотя и доступны, не имеют такой регулярной структуры памяти.
См. комментарий к LvalueBit для объяснения того, как LvalueBit и DirectAccessBit взаимно ортогональны.
EvalBeforeAssigningBit
| EIGEN_DEPRECATED const unsigned int Eigen::EvalBeforeAssigningBit |
- Устаревшее:
- означает, что выражение должно быть вычислено перед любым присваиванием
EvalBeforeNestingBit
| const unsigned int Eigen::EvalBeforeNestingBit |
означает, что выражение должно быть вычислено вызывающим выражением
LinearAccessBit
| const unsigned int Eigen::LinearAccessBit |
Краткое описание: означает, что выражение можно рассматривать как одномерный вектор.
Подробное описание: означает, что к коэффициентам этого выражения можно получить доступ с помощью coeff(int) и coeffRef(int) в случае выражения с lvalue. Эти методы доступа на основе индексов гарантируют, что не будет никаких вычислений во время выполнения пары (строка, столбец) из индекса, поэтому гарантируется, что доступ на основе индекса будет, по крайней мере, не медленнее доступа на основе (строка, столбец), когда он доступен. У выражений, для которых это невозможно, нет флага LinearAccessBit.
Если установлены оба флага PacketAccessBit и LinearAccessBit, то к пакетам этого выражения можно получить доступ с помощью packet(int) и writePacket(int) в случае выражения с lvalue.
Обычно все векторные выражения имеют флаг LinearAccessBit, но есть одно исключение: выражения Product не имеют его, потому что это было бы неудобно для векторизации, даже если Product является векторным выражением. Таким образом, векторные выражения Product позволяют доступ к коэффициентам на основе индексов, но не доступ к пакетам на основе индексов, поэтому у них нет флага LinearAccessBit.
LvalueBit
| const unsigned int Eigen::LvalueBit |
Означает, что выражение имеет метод coeffRef(), т.е. его можно изменить, так как его отдельные коэффициенты напрямую доступны. Это исключает только для чтения выражения.
Обратите внимание, что DirectAccessBit и LvalueBit взаимно ортогональны, так как существуют примеры выражений, имеющих одно, но не другое:
- изменяемые выражения, которые не имеют очень простой структуры памяти как массива со смещением, имеют LvalueBit, но не DirectAccessBit
- выражения Map-to-const, например Map<const Matrix>, имеют DirectAccessBit, но не LvalueBit
У выражений, имеющих LvalueBit, их метод coeff() возвращает ссылку const вместо возвращения нового значения.
NoPreferredStorageOrderBit
| const unsigned int Eigen::NoPreferredStorageOrderBit |
для выражения это означает, что порядок хранения может быть либо строчным, либо столбцовым. Точный выбор будет определен в момент вычисления или при комбинировании с другими выражениями.
- См. также
- RowMajorBit, Порядки хранения
PacketAccessBit
| const unsigned int Eigen::PacketAccessBit |
Краткое описание: означает, что выражение может быть векторизовано
Подробное описание: означает, что коэффициенты могут обрабатываться пакетами и начинаются в позиции памяти, выравнивание которой соответствует требованиям текущей архитектуры процессора для оптимизированного доступа к пакетам. В случае с фиксированным размером есть дополнительное условие, что все коэффициенты можно получить с помощью пакетов (это подразумевает требование, чтобы размер был кратным 16 байтам, и что любые нетривиальные смещения не нарушают выравнивание). В случае с динамическим размером нет такого условия относительно общего размера и смещений, поэтому получить доступ ко всем коэффициентам с помощью пакетов может быть невозможно.
- Примечание
- Этот бит может быть установлен независимо от того, включена ли векторизация. Чтобы проверить фактическую векторизуемость, см. ActualPacketAccessBit.
RowMajorBit
| const unsigned int Eigen::RowMajorBit |
для матрицы это означает, что порядок хранения — строчный. Если этот бит не установлен, порядок хранения — столбцовый. Для выражения это определяет порядок хранения матрицы, созданной путем вычисления этого выражения.
- См. также
- Порядки хранения
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/group__flags.html