Инвертирование матрицы любого размера

Я использую Научную библиотеку GNU для реализации калькулятора, который должен уметь возводить матрицы в степень. К сожалению, похоже, что в GSL нет такой функции для четного умножения матриц (функция gsl_matrix_mul_elements() умножает только с использованием процесса сложения) и, соответственно, без возведения в степень.

Я хочу иметь возможность возводить в отрицательные степени, что требует способности принимать обратное. Из моих поисков я не смог найти никакого звукового кода для вычисления обратных произвольных матриц (только те, которые имеют определенные размеры), и руководства, которые я нашел для выполнения этого вручную, используют умные «бумажные трюки», которые не не работает в коде.

Существует ли общий алгоритм, который можно использовать для вычисления обратной матрицы любого размера (конечно, за исключением случая, когда нельзя вычислить обратную)?


person 2mac    schedule 31.05.2015    source источник
comment
Только квадратные матрицы (и то только некоторые из них) могут быть инвертированы.   -  person pmg    schedule 31.05.2015
comment
Это нормально. Однако мне нужна одна функция, которая может сделать это для квадратной матрицы любого размера.   -  person 2mac    schedule 31.05.2015
comment
Вы знакомы с LU разложением?   -  person John Alexiou    schedule 31.05.2015
comment
Я не был, но теперь я вижу раздел в документах GSL.   -  person 2mac    schedule 31.05.2015
comment
Как только вы вычислите обратную, вы можете просто написать простую рекурсивную функцию, чтобы быстро вычислить отрицательную мощность.   -  person Intrepid Traveller    schedule 31.05.2015
comment
Предполагая, что вы не заинтересованы в том, чтобы вычислять LU-разложение и инвертировать его с помощью GSL, открытая статистическая библиотека C Apophenia (apophenia .info) может быть тем, что вы ищете. Требуется немного обучения, чтобы разобраться со структурами данных, а что нет, но как только вы поймете, как это работает, тонна вещей в GSL (например, инверсия матриц) будет хорошо абстрагирована. Прочитав небольшое введение, перейдите на apophenia.info/group__linear__алгебра.html для получения дополнительной информации о инверсия матрицы в частности.   -  person DIMMSum    schedule 01.06.2015


Ответы (2)


Как упоминалось в комментариях, мощность матриц может быть вычислена для квадратных матриц для целых показателей. Сила n числа A равна A^n = A*A*...A, где A встречается n раз. Если B является обратным A, то -n степень A равна A^(-n) = (A^-1)^n = B^n = B*B*...B.

Итак, чтобы вычислить степень n числа A, я могу предложить следующий алгоритм с использованием GSL:

gsl_matrix_set_identity();         // initialize An as I
for(i=0;i<n;i++) gsl_blas_dgemm(); // compute recursive product of A

Для вычисления матрицы B вы можете использовать следующую процедуру

gsl_linalg_LU_decomp();       // compute A decomposition
gsl_linalg_complex_LU_invert  // comput inverse from decomposition
person ztik    schedule 01.06.2015
comment
Это объяснение не объясняет метод получения gsl_permutation_t, требуемого gsl_linalg_LU_decomp(), в качестве параметра. Данные в нем должны быть уже инициализированы. - person 2mac; 10.06.2015
comment
@2mac gsl_permutation_t не всегда нужен. Это зависит от способа хранения данных. Вопрос не дает никакой информации об этом. - person ztik; 10.06.2015
comment
Но при просмотре источника gsl_linalg_LU_decomp() второе, что он делает, это проверяет, равен ли размер перестановки значению матрицы size1. Если я не инициализирую его должным образом, это вернет false (ну, действительно неопределенное), и вызов завершится ошибкой. - person 2mac; 10.06.2015
comment
@2mac Я не понимаю источник проблемы, но учтите, что обратимыми могут быть только квадратные матрицы. - person ztik; 10.06.2015
comment
gsl_linalg_LU_decomp() требует gsl_permutation в качестве второго аргумента. Этот gsl_permutation используется внутри функции, и он должен иметь определенные значения, основанные на матрице, заданной в качестве первого аргумента. Если я не инициализирую перестановку должным образом, вызов завершится ошибкой, потому что невозможно сказать, какие данные я ему передаю, и просто инициализация размера невозможна, поскольку значение перестановки используется позже в декомпозиции. Это не имеет ничего общего с тем, является ли матрица квадратной. Это связано с памятью и с тем, как данные должны быть инициализированы, что является элементарным в C. - person 2mac; 10.06.2015

Я рекомендую прочитать о SVD, который реализует gsl. Если ваша матрица обратима, то вычисление ее с помощью SVD — неплохой, хотя и несколько медленный способ. Если ваша матрица необратима, SVD позволяет вам вычислить следующую лучшую вещь, обобщенная инверсия.

В матричных вычислениях ошибки, присущие арифметике с плавающей запятой, могут тревожно накапливаться. Одним из примеров является матрица Гильберта, невинно выглядящая вещь с удивительно большим числом обусловленности, даже для весьма умеренная размерность. Хороший тест процедуры обращения состоит в том, чтобы увидеть, насколько велика матрица Гильберта, которую она может инвертировать, и насколько близки вычисленные обратные умножения матрицы к идентичности.

person dmuir    schedule 02.06.2015