Конъюгировать транспонирование себя с использованием синтаксиса NumPy - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь перевести этот код MATLAB на Python.

Следующий код:

Y=C*Up(:,1:p-1)'*Y;

И это мой перевод до сих пор:

Y = C * Up[:, 1:p-1] * Y

У меня возникли проблемы с синтаксисом сопряженной транспонирования self, который используется в коде MATLAb. Я не уверен, что моя первая идея:

Y = C * Up[:, 1:p-1].getH() * Y

будет правильно.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 30 июня 2018

Я не очень разбираюсь в numpy, но, основываясь на комментариях @ hpaulj , могу предложить следующее:

Если вы не хотите подчиняться ограничениям numpy.matrix объектов (см. Предупреждение здесь ), вы можете определить свою собственную функцию для выполнения сопряженной транспонирования. Все, что вам нужно сделать, это транспонировать массив, затем вычесть мнимую часть результата, умноженную на 2, из результата. Я не уверен, насколько это эффективно с точки зрения вычислений, но это определенно должно дать правильный результат.

Я бы ожидал, что что-то вроде этого будет работать:

Y = C * ctranspose(Up[:, 0:p-1]) * Y

...

def ctranspose(arr: np.ndarray) -> np.ndarray:
    # Explanation of the math involved:
    # x      == Real(X) + j*Imag(X)
    # conj_x == Real(X) - j*Imag(X)
    # conj_x == Real(X) + j*Imag(X) - 2j*Imag(X) == x - 2j*Imag(X)
    tmp = arr.transpose()
    return tmp - 2j*tmp.imag

(Решение для Python 3)


Более элегантное решение, основанное на комментарии @ AndrasDeak :

Y = C * Up[:, 0:p-1].conj().T * Y

Обратите также внимание на два различия, связанных с индексацией между python и MATLAB:

  • Python основан на 0 (т. Е. Первый индекс массива равен 0, в отличие от MATLAB, где он 1)
  • Индексирование в Python inclusive:exclusive в отличие от MATLAB, где оно inclusive:inclusive.

Поэтому, когда мы хотим получить доступ к первым 3 элементам вектора в MATLAB, мы пишем:

res = vec(1:3);

В Python мы пишем:

res = vec[0:3] # or [:3]

(Опять же, кредиты @Andras за это объяснение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...