2015-05-31 9 views
1

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

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

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

+1

Только квадратные матрицы (а затем только некоторые из них) могут быть инвертированы. – pmg

+0

Все в порядке. Тем не менее, я хочу одну функцию, которая может сделать это для любой квадратной матрицы размера. – 2mac

+2

Вы знакомы с 'LU' разложением? – ja72

ответ

0

Как указано в комментариях, мощность матриц может быть вычислена для квадратных матриц для целых показателей. n мощность A: A^n = A*A*...A, где An раз. Если B является инверсией A, то мощность -nA равна 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 
+0

Это объяснение не объясняет способ получения 'gsl_permutation_t', требуемый' gsl_linalg_LU_decomp() 'в качестве параметра. Данные в нем должны быть уже инициализированы. – 2mac

+0

@ 2mac 'gsl_permutation_t' не всегда требуется.Это зависит от способа хранения данных. Вопрос не дает никакой информации об этом. – ztik

+0

Но, смотря на источник 'gsl_linalg_LU_decomp()', второе, что он делает, это проверить, что размер перестановки равен размеру 'size1' матрицы. Если я не инициализирую его правильно, это вернет false (ну, действительно не определено), и вызов завершится неудачно. – 2mac

0

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

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