使用 numpy 语法对 self 进行共轭转置

Posted

技术标签:

【中文标题】使用 numpy 语法对 self 进行共轭转置【英文标题】:Conjugate transpose of self using numpy syntax 【发布时间】:2018-12-08 23:00:11 【问题描述】:

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

应该是正确的。

有人有什么想法吗?

【问题讨论】:

你能提供矩阵(矩阵)的样本输入吗? 1:p-1 - 请记住,python 索引是基于 0,基于 MATLAB 1。 Up(可能)复杂吗?如果没有,那么简单的transpose 就足够了。我要警告转置不对一维数组做任何事情,但Up 显然是二维的,你还想要什么样的乘法?矩阵或元素明智? MATLAB 和 numpy 有不同的运算符。 .getHnp.matrix 子类的方法。 np.matrix 类似于 MATLAB(包括其对 * 的定义),不鼓励在 numpy 中使用它。 Up.T.conjugte() 将对 ndarray 对象执行相同的操作。当然,只有在 Up 很复杂时才需要 conjugate 部分。 【参考方案1】:

我对 numpy 不是很有经验,但根据 @hpaulj 的 cmets,我可以提出以下建议:

如果您不想受到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 的解释)

【讨论】:

为什么不arr.conj().T 基本的我亲爱的@Andras - 因为我不知道这样的功能存在:) 另外,* 仅在 OP 具​​有 np.matrices 时才执行 matmul,否则他们需要 @ 太完美了!感谢您的详尽解释和帮助!【参考方案2】:

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

【讨论】:

以上是关于使用 numpy 语法对 self 进行共轭转置的主要内容,如果未能解决你的问题,请参考以下文章

matlab中转置与共轭转置的问题

matlab转置矩阵命令

关于矩阵

复数矩阵A 的共轭矩阵应该怎么算?谁对?

matlab中求矩阵的转置矩阵,是啥函数?

matlab中怎么求矩阵的转置