Spec-Zone.ru › Eigen3

Начало работы

Это краткое руководство по началу работы с Eigen. Оно имеет двойное назначение. Оно служит минимальным введением в библиотеку Eigen для людей, которые хотят начать программирование как можно скорее. Вы также можете прочитать эту страницу как первую часть учебника, в котором библиотека объясняется более подробно; в этом случае вы продолжите с классом матриц.

Как "установить" Eigen?

Для использования Eigen, вам нужно просто загрузить и распаковать исходный код Eigen (см. вики для инструкций по загрузке). Фактически, заголовочные файлы в подкаталоге Eigen — единственные файлы, необходимые для компиляции программ с использованием Eigen. Заголовочные файлы одинаковы для всех платформ. Не нужно использовать CMake или устанавливать что-либо.

Простая первая программа

Вот довольно простая программа для начала работы.

#include <iostream>
#include <Eigen/Dense>
 
using Eigen::MatrixXd;
 
int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}

Мы объясним программу после того, как расскажем вам, как ее скомпилировать.

Компиляция и запуск вашей первой программы

Нет никакой библиотеки, с которой нужно связаться. Единственное, что вам нужно учитывать при компиляции вышеуказанной программы, это то, что компилятор должен иметь возможность найти заголовочные файлы Eigen. Директория, в которой вы поместили исходный код Eigen, должна находиться в пути включения. С помощью GCC вы используете опцию -I для достижения этого, поэтому вы можете скомпилировать программу с помощью такой команды:

g++ -I /path/to/eigen/ my_program.cpp -o my_program 

В Linux или Mac OS X другой вариант — создать символическую ссылку или скопировать папку Eigen в /usr/local/include/. Таким образом, вы можете скомпилировать программу с помощью:

g++ my_program.cpp -o my_program 

При запуске программы она выведет следующий результат:

  3  -1
2.5 1.5

Объяснение первой программы

Заголовочные файлы Eigen определяют множество типов, но для простых приложений может быть достаточно использовать только тип MatrixXd. Он представляет матрицу произвольного размера (отсюда X в MatrixXd), в которой каждый элемент является double (отсюда d в MatrixXd). См. краткое руководство для обзора различных типов, которые вы можете использовать для представления матрицы.

Файл заголовков Eigen/Dense определяет все функции-члены для типа MatrixXd и связанных типов (см. также таблицу заголовочных файлов). Все классы и функции, определенные в этом заголовочном файле (и других заголовочных файлах Eigen), находятся в пространстве имен Eigen.

Первая строка функции main объявляет переменную типа MatrixXd и указывает, что это матрица с 2 строками и 2 столбцами (элементы не инициализированы). Выражение m(0,0) = 3 устанавливает элемент в верхнем левом углу в значение 3. Для ссылки на элементы матрицы необходимо использовать круглые скобки. Как обычно в информатике, индекс первого индекса равен 0, в отличие от математической конвенции, где первый индекс равен 1.

Следующие три оператора устанавливают остальные три элемента. Последняя строка выводит матрицу m в поток стандартного вывода.

Пример 2: Матрицы и векторы

Вот еще один пример, который объединяет матрицы и векторы. Сейчас сосредоточьтесь на программе слева; мы поговорим о программе справа позже.

Размер задается во время выполнения: Размер задается во время компиляции:
#include <iostream>
#include <Eigen/Dense>
 
using namespace Eigen;
using namespace std;
 
int main()
{
  MatrixXd m = MatrixXd::Random(3,3);
  m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
  cout << "m =" << endl << m << endl;
  VectorXd v(3);
  v << 1, 2, 3;
  cout << "m * v =" << endl << m * v << endl;
}
#include <iostream>
#include <Eigen/Dense>
 
using namespace Eigen;
using namespace std;
 
int main()
{
  Matrix3d m = Matrix3d::Random();
  m = (m + Matrix3d::Constant(1.2)) * 50;
  cout << "m =" << endl << m << endl;
  Vector3d v(1,2,3);
  
  cout << "m * v =" << endl << m * v << endl;
}

Вывод будет следующим:

m =
  94 89.8 43.5
49.4  101 86.8
88.3 29.8 37.8
m * v =
404
512
261

Объяснение второго примера

Во втором примере сначала объявляется 3-на-3 матрица m, которая инициализируется с помощью метода Random() случайными значениями в диапазоне от -1 до 1. Следующая строка применяет линейное преобразование, так что значения находятся в диапазоне от 10 до 110. Вызов функции MatrixXd::Constant(3,3,1.2) возвращает выражение матрицы 3x3, имеющее все коэффициенты равными 1,2. Остальное — стандартная арифметика.

Следующая строка функции main представляет новый тип: VectorXd. Он представляет (столбец) вектор произвольного размера. Здесь вектор v создается для хранения 3 коэффициентов, которые не инициализированы. Предпоследняя строка использует так называемый инициализатор через запятую, описанный в Расширенная инициализация, чтобы установить все коэффициенты вектора v следующим образом:

\[ v = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix}. \]

Последняя строка программы умножает матрицу m на вектор v и выводит результат.

Теперь посмотрите на вторую программу-пример. Мы представили две ее версии. В версии в левом столбце матрица имеет тип MatrixXd, который представляет матрицы произвольного размера. Версия в правом столбце похожа, за исключением того, что матрица имеет тип Matrix3d, который представляет матрицы фиксированного размера (здесь 3-на-3). Поскольку тип уже кодирует размер матрицы, нет необходимости указывать размер в конструкторе; сравните MatrixXd m(3,3) с Matrix3d m. Аналогично, у нас есть VectorXd слева (произвольный размер) и Vector3d справа (фиксированный размер). Обратите внимание, что здесь коэффициенты вектора v непосредственно задаются в конструкторе, хотя можно использовать и синтаксис левого примера.

Использование матриц и векторов фиксированного размера имеет два преимущества. Компилятор генерирует лучший (более быстрый) код, поскольку знает размер матриц и векторов. Указание размера в типе также позволяет выполнять более строгую проверку на этапе компиляции. Например, компилятор сообщит об ошибке, если вы попытаетесь умножить Matrix4d (матрицу 4x4) на Vector3d (вектор размера 3). Однако использование многих типов увеличивает время компиляции и размер исполняемого файла. Размер матрицы также может быть неизвестен на этапе компиляции. Правило хорошего тона — использовать матрицы фиксированного размера для размеров 4x4 и меньше.

Куда двигаться дальше?

Стоит потратить время на чтение подробного учебника.

Однако, если вы считаете, что вам это не нужно, вы можете напрямую использовать документацию по классам и наше краткое справочное руководство.

  • Далее: Класс матриц

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

Spec-Zone.ru

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