代码之家  ›  专栏  ›  技术社区  ›  A.Torres

自用numpy语法的共轭转置

  •  2
  • A.Torres  · 技术社区  · 6 年前

    我正在尝试将这个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 回复  |  直到 6 年前
        1
  •  3
  •   Dev-iL    6 年前

    我对numpy不是很有经验,但是根据 @帕利 我可以建议如下:

    如果你不想受到 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)


    基于 @安德拉斯达克 以下内容:

    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)