我正在尝试将此MATLAB代码转换为Python。
以下是代码:
Y=C*Up(:,1:p-1)'*Y;
这是我到目前为止的翻译:
Y = C * Up[:, 1:p-1] * Y
我对MATLAb代码中使用的self的共轭转置的语法感到麻烦。我不确定我的第一个想法:
Y = C * Up[:, 1:p-1].getH() * Y
是正确的。
有人有什么想法吗?
答案 0 :(得分:2)
我对numpy并不十分了解,但是基于 @hpaulj 的评论,我可以提出以下建议:
如果不想受numpy.matrix
对象的限制(请参阅警告here),则可以定义自己的函数来进行共轭转置。您需要做的就是转置数组,然后从结果中减去结果的虚部乘以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之间的索引编制有关的两个区别:
0
,与MATLAB中1
不同)是inclusive:exclusive
,而MATLAB中的索引为inclusive:inclusive
。因此,当我们要访问MATLAB中向量的前3个元素时,我们将编写:
res = vec(1:3);
在Python中,我们将编写:
res = vec[0:3] # or [:3]
(同样,感谢@Andras解释)
答案 1 :(得分:0)
使用 arr.conj().T 得到矩阵的复共轭。