简短回答:
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工具都需要数组,如果给定了矩阵,许多工具就会出现故障,或者将它们转换为数组。所以只需使用数组。在