У меня есть алгоритм, который выделяет сложную двойную матрицу «A» с заранее определенным размером N x N. Элементы изначально равны нулю. Я также выделил матрицу размера N x N для хранения обратного «A_inv». Во время алгоритма элементы «А» заполняются. На каждой итерации i я получаю подматрицу размером i x i. Так это выглядит, как это для второй итерации, где N = 4:Как эффективно инвертировать только часть выделенной матрицы
| x00 x01 0.0 0.0 |
| x10 x11 0.0 0.0 |
| 0.0 0.0 0.0 0.0 |
| 0.0 0.0 0.0 0.0 |
где иксы показывают некоторое ненулевое значение. Теперь я хочу инвертировать ненулевую часть матрицы (матрица 2x2 в этом примере). До сих пор я делал это следующим образом:
- копию ненулевые элементы «А» в матрице 2х2 GSL
- использование разложения GSL LU, чтобы инвертировать матрицу 2х2 GSL
- скопируйте преобразованную матрицу 2x2 в A_inv
Проблема с этим подходом заключается в том, что мне приходится копировать по матрице дважды на каждой итерации. Однажды на меньшую n x n gsl-матрицу и один раз, чтобы скопировать полученную инвертированную матрицу nxn gsl в A_inv.
Мне было интересно, знает ли кто-нибудь о более прямом пути. Есть ли способ использовать некоторую функцию gsl только для инвертирования части матрицы и игнорирования любых нулевых элементов? сказать что-то вроде этого:
A = NxN matrix
A_inv = invert_submatrix(A,n,n)
где п < Н. Здесь invert_submatrix()
будет рассматривать только п х п часть А. Кроме того, исходная матрица «А» не должны быть изменены с помощью этой инверсии. Возможно, последнее требование требует скопировать по матрице в любом случае, и в этом случае оно будет неэффективным, чем то, что я делаю сейчас. Тем не менее, алгоритмы gsl, как правило, намного эффективнее, чем я обычно придумываю. Поэтому мысли об этом по-прежнему очень приветствуются.