【问题标题】:Conjugate transpose of self using numpy syntax使用 numpy 语法对 self 进行共轭转置
【发布时间】: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 部分。

标签: python matlab numpy matrix scipy


【解决方案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 获得矩阵的复共轭。

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2018-04-24
    • 2013-03-21
    • 1970-01-01
    • 2012-08-20
    • 2022-11-19
    相关资源
    最近更新 更多