使用numpy语法共轭自身的转置

时间:2018-06-29 17:43:35

标签: python matlab numpy matrix scipy

我正在尝试将此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

是正确的。

有人有什么想法吗?

2 个答案:

答案 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之间的索引编制有关的两个区别:

  • Python是基于0的(即数组的第一个索引是0,与MATLAB中1不同)是
  • Python中的索引为inclusive:exclusive,而MATLAB中的索引为inclusive:inclusive

因此,当我们要访问MATLAB中向量的前3个元素时,我们将编写:

res = vec(1:3);

在Python中,我们将编写:

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

(同样,感谢@Andras解释)

答案 1 :(得分:0)

使用 arr.conj().T 得到矩阵的复共轭。