使用 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 有不同的运算符。
.getH
是np.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.matri
ces 时才执行 matmul,否则他们需要 @
。
太完美了!感谢您的详尽解释和帮助!【参考方案2】:
使用 arr.conj().T 获得矩阵的复共轭。
【讨论】:
以上是关于使用 numpy 语法对 self 进行共轭转置的主要内容,如果未能解决你的问题,请参考以下文章