- Типы матриц и векторов
- Создание и инициализация матриц и векторов
- Копирование матриц, векторов и массивов
- Копирование таймсерий в матрицу или вектор
- Копирование истории тиков в матрицу или вектор
- Вычисление выражений с матрицами и векторами
- Манипуляции над матрицами и векторами
- Произведения матриц и векторов
- Преобразования (разложение) матриц
- Получение статистики
- Характеристики матриц и векторов
- Решение уравнений
- Методы машинного обучения
Создание и инициализация матриц и векторов
Предусмотрено несколько способов объявления и инициализации матриц и векторов. Их можно условно разделить на несколько категорий по своему назначению:
- объявление без указания размера;
- объявление с указанием размера;
- объявление с инициализацией;
- статические методы создания;
- нестатические методы (пере-)конфигурирования и инициализации.
Самый простой метод создания — это объявление без указания размера, то есть без распределения памяти для данных. Для этого достаточно указать тип и имя переменной:
matrix matrix_a; // матрица типа double
|
Далее вы можете изменить размер созданных объектов и заполнить нужными значениями. Также их можно использовать во встроенных методах матриц и векторов для получения результатов вычислений. Все эти методы будут рассмотрены по группам в разделах этой главы.
Можно объявить матрицу или вектор с указанием размера. При этом произойдет распределение памяти, но без какой-либо инициализации. Для этого после имени переменной в круглых скобках задаем размер(ы) (для матрицы — сначала количество строк, затем количество столбцов):
matrix matrix_a(128, 128); // в качестве параметров можно указывать
|
Третий способ создания объектов — объявление с инициализацией. Размеры матриц и векторов в этом случае определяются инициализирующей последовательностью, указанной в фигурных скобках:
matrix matrix_a = {{0.1, 0.2, 0.3}, {0.4, 0.5, 0.6}};
|
Существуют также статические методы создания матриц и векторов указанного размера с инициализацией определённым способом (под ту или иную каноническую форму). Все они приведены в списке ниже и имеют схожие прототипы (векторы отличаются от матриц только отсутствием второго размера).
static matrix<T> matrix<T>::Eye∫Tri(const ulong rows, const ulong cols, const int diagonal = 0);
static matrix<T> matrix<T>::Identity∫Ones∫Zeros(const ulong rows, const ulong cols);
static matrix<T> matrix<T>::Full(const ulong rows, const ulong cols, const double value);
- Eye — создает матрицу с единицами по указанной диагонали и нулями в остальных местах;
- Tri — создает матрицу с единицами по указанной диагонали и ниже нее, и нулями в остальных местах;
- Identity — создает единичную матрицу указанного размера;
- Ones — создает матрицу (или вектор), заполненную единицами;
- Zeros — создает матрицу (или вектор), заполненную нулями;
- Full — создает матрицу (или вектор), заполненную заданным значением во всех элементах.
При необходимости можно "превратить" любую уже существующую матрицу в единичную, для чего к ней следует применить нестатический метод Identity (без параметров).
Продемонстрируем методы в действии:
matrix matrix_a = matrix::Eye(4, 5, 1);
|
Кроме того, существуют нестатические методы для инициализации матрицы/вектора заданными значениями — Init и Fill.
void matrix<T>::Init(const ulong rows, const ulong cols, func_reference rule = NULL, ...)
void matrix<T>::Fill(const T value)
Важным достоинством метода Init (впрочем, как и конструкторов) является возможность указать в параметрах инициализирующую функцию для заполнения элементов матрицы/вектора по заданному закону (см. пример чуть ниже).
Ссылку на такую функцию можно передать после размеров, указав её идентификатор без кавычек в параметре rule (это не указатель в смысле typedef (*pointer)(...) и не строка с именем).
Инициализирующая функция должна иметь первым параметром ссылку на заполняемый объект, а также может иметь дополнительные параметры: в этом случае значения для них передаются в Init или конструктор после ссылки на саму функцию. Без указания rule-ссылки будет просто создана матрица заданных размеров.
Метод Init позволяет заодно изменить конфигурацию матрицы.
Покажем все изложенное на небольших примерах.
matrix m(2, 2);
|
Здесь метод Init был использован для изменения размеров уже инициализированной матрицы, что привело к заполнению новых элементов случайными значениями.
А следующая функция заполняет матрицу числами, увеличивающимся в геометрической прогрессии:
template<typename T>
|
Тогда её можно применить для создания матрицы.
void OnStart()
|
Результат выполнения:
M =
|
В данном случае значения для параметра инициализирующей функции не были указаны следом за её идентификатором в вызове конструктора, и потому использовалось значение по умолчанию (1). Но мы можем, например, для той же MatrixSetValues передать стартовое значение -1, что приведет к заполнению матрицы отрицательным рядом.
matrix M(3, 6, MatrixSetValues, -1); |