Псевдообращение с тензорным потоком не работает для сложных матриц - PullRequest
0 голосов
/ 02 февраля 2020

В документации Tensorflow говорится, что:

tf.linalg.pinv "аналогично numpy .linalg.pinv. Он отличается только значением по умолчанию rcond" .

Однако, tf.linalg.pinv требует, чтобы матрица имела тип float, тогда как np.linalg.pinv можно использовать со сложными матрицами.

Мне было интересно, почему они будут создавать ее только для float типы и, если есть простой способ изменить tf.linalg.pinv для использования со сложными матрицами

1 Ответ

0 голосов
/ 08 февраля 2020

Я только что столкнулся с такой же ситуацией. Если вам нужно явно построить обратное, проверьте этот документ:

https://pdfs.semanticscholar.org/f278/b548b5121fd0d09c2e589439b97fad16ece3.pdf

В частности, учитывая Матрицу M, которую нужно инвертировать, вы можете просто do:

    A = tf.math.real(M)
    C = tf.math.imag(M)

    r0  = tf.linalg.pinv(A) @ C
    y11 = tf.linalg.pinv(C @ r0 + A)
    y10 = -r0 @ y11

    M_inverse = tf.cast(tf.complex(y11,y10), dtype = M.dtype)

Сложность немного выше, чем у чисто сложной реализации, но пока она оказалась довольно стабильной для меня.

...