简短回答:

MATLAB中的'算子是矩阵(共轭)转置算子。它使矩阵在维度上翻转,并得到矩阵的复共轭(第二部分是使人困惑的部分),简单的回答是,在Python中,a'的等价物是np.atleast_2d(a).T.conj()。在

稍长回答:

不要在MATLAB中使用',除非你真的知道自己在做什么。使用.',这是普通的转置。它相当于Python中的np.atleast_2d(a).T(无共轭)。如果您确定python中的a.ndim >= 2,那么您就可以使用a.T。如果您确定在Python中a.ndim == 1,那么可以使用a[None].T。如果您确定在Python中a.ndim == 0,那么转置是没有意义的,所以只需做任何您想做的事情。在

很长的答案:

转置的基本思想是将数组或矩阵翻转一个维度,因此请考虑以下内容:>> a=[1,2,3,4,5,6]

a =

1 2 3 4 5 6

>> a'

ans =

1

2

3

4

5

6

>> b=[1,2,3;4,5,6]

b =

1 2 3

4 5 6

>> b'

ans =

1 4

2 5

3 6

所以看起来很清楚,'做了一个转置。但这是欺骗:

^{pr2}$

那些底片是从哪里来的?他们不在原来的阵型里。原因在documentation中描述。MATLAB中的'算子不是正规转置算子,正规转置算子是.'。'运算符执行一个复共轭转置。它对矩阵进行转置,并对矩阵进行复共轭。在

问题是,这几乎永远不是你真正想要的。例如,这将导致代码看起来像预期的那样工作,但会悄悄地更改您的FFT数据。因此,除非您绝对肯定您的算法需要复杂的共轭转置,否则请使用.'。在

对于Python,Python转置操作符是.T。所以你认为:>>> a = np.array([[1, 2, 3, 4, 5, 6]])

>>> print(a)

[[1 2 3 4 5 6]]

>>> print(a.T)

[[1]

[2]

[3]

[4]

[5]

[6]]

>>> b = np.array([[1j, 2j, 3j, 4j, 5j, 6j]])

[[ 0.+1.j 0.+2.j 0.+3.j 0.+4.j 0.+5.j 0.+6.j]]

>>> (1j*np.ones((1,10))).T

[[ 0.+1.j]

[ 0.+2.j]

[ 0.+3.j]

[ 0.+4.j]

[ 0.+5.j]

[ 0.+6.j]]

注意想象部分没有任何否定。如果你想得到复共轭转置,你需要使用np.conj(a)或{}来获得复共轭(在转置之前或之后)。然而,numpy有自己的转置陷阱:>>> c = np.array([1, 2, 3, 4, 5, 6])

>>> print(c)

[1 2 3 4 5 6]

>>> print(c.T)

[1 2 3 4 5 6]

嗯?它什么也没做。原因是np.array([1, 2, 3, 4, 5, 6])创建了一个1D数组。转置是沿着特定的维度翻转数组。当只有一个维度时,这是没有意义的,所以转置什么都不做。在

“但是,”你可能会反对,“1D MATLAB矩阵的转置难道不起作用吗?”原因更为根本的原因是MATLAB和numpy如何存储数据。以Python为例:>>> np.array([[1, 2, 3], [4, 5, 6]]).ndim

2

>>> np.array([1, 2, 3, 4, 5, 6]).ndim

1

>>> np.array(1).ndim

0

这似乎是合理的。二维数组有二维,一维数组有一维,标量有零维。但在MATLAB中尝试同样的方法:>> ndims([1,2,3;4,5,6])

ans =

2

>> ndims([1,2,3,4,5,6])

ans =

2

>> ndims(1)

ans =

2

一切都有两个维度!MATLAB没有1D或0D数据结构,MATLAB中的所有东西都必须至少有2维(尽管可以在MATLAB中创建自己有效的1D或0D类)。所以在MATLAB中对你的“1D”数据结构进行转置是有效的,因为它实际上不是1D

共轭转置和1D转置问题都归结为基本数据类型MATLB和numpy的使用。MATLAB使用矩阵,矩阵本质上至少是2D,而nump则使用数组,数组可以有任意数量的维。MATLAB矩阵使用矩阵数学作为它们的正规运算(所以MATLAB中的a * b是一个矩阵乘积),而Python数组则使用逐元素数学作为它们的正规运算符(因此a * b是一个逐元素的乘积,相当于MATLAB中的a .* b)。MATLAB有逐元素运算符,numpy数组有矩阵运算符(虽然还没有矩阵转置,但正在考虑添加一个),因此这主要适用于默认操作。在

为了在Python中避免这个问题,有几种方法可以绕过它。在Python中使用None索引插入广告传统尺寸。所以对于一维数组a,a[None]将是一个二维数组,其中第一维的长度为1。如果事先不知道数组的维数是多少,可以使用np.atleast_2d(a),这将确保a至少有两个维度。所以0D变成2D,1D变成2D,2D保持2D,3D保持3D,4D保持4D,等等

也就是说,numpy有一个matrix类,在所有这些方面都与MATLAB的一样(它甚至有一个共轭转置运算符.H)。不要使用它。python社区已经围绕数组进行了标准化,因为实际上这几乎总是您想要的。这意味着大多数Python工具都需要数组,如果给定了矩阵,许多工具就会出现故障,或者将它们转换为数组。所以只需使用数组。在

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐