Я не очень разбираюсь в 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 за это объяснение)