Я много лет не пользовался определением кольца, известным из курса алгебры, однако постановка вопроса показалась мне странной, ведь в отличие от тела, где у каждого элемента за исключением нуля есть обратные элементы, у элемента кольца может не быть обратного. Для того, чтобы написать об обобщениях понятия обращения элемента, я освежил память с помощью Википедии. Заодно выяснил, что слово "кольцо" было введено в оборот математиков Давидом Гильбертом в конце 19-го века, почти за тридцать лет до того, как Эмми Нётер дала современное аксиоматическое определение кольца как алгебраической системы, имеющей структуры коммутативной группы по сложению, и полугруппы по умножению.
В середине XX века несколько математиков независимо развили теорию обобщенного обращения элементов кольца.
Кольцо является полугруппой относительно умножения. Для элемента x полугруппы может быть определен слабый обратный элемент y, как элемент, удовлетворяющий соотношению:
y x y = y (1).
Если для всякого элемента полугруппы x найдётся единственный элемент y, который является слабым обратным и дополнительно удовлетворяет условию
x y x = x (2),
то такая полугруппа называется инверсионной полугруппой. Оказывается, что кольца матриц над вещественными или комплексными числами являются инверсионными полугруппами относительно умножения матриц.
Так была развита теория обобщенного обращения Мура и Пенроуза. Псевдообратной матрицей для матрицы A по определению Мура-Пенроуза называется матрица A+, удовлетворяющая четырем соотношениям:
A A+ A = A
A+ A A+ = A+
(A A+)* = A A+
(A+ A)* = A+ A
Оказывается, что такая псевдообратная матрица существует и единственна для колец матриц над C и R, а также, как следствие, совпадает с обратной матрицей для матриц полного ранга.
Алгоритм вычисления псевдообратной матрицы основан на алгоритме сингулярного разложения. Если A = U D V*, то достаточно найти псевдообратную матрицу для диагональной матрицы D, а затем вычислить A+ = V D+ U*. Этот алгоритм реализован в пакетах интерактивной линейной алгебры Matlab, Octave, Scilab, NumPy и т.п. как функция pinv.