python中矩阵的除法和乘法
这是一个有细节的问题,我觉得更清楚 假设我有一个矩阵python中矩阵的除法和乘法,python,matlab,Python,Matlab,这是一个有细节的问题,我觉得更清楚 假设我有一个矩阵h,大小4x4,和一个向量x,大小4x1,如果我们有y是h和x之间的乘法输出,这意味着y=h*x其大小为1 x 4。因此,当我将h中每列的倒数乘以向量y时,我应该能够得到向量x的向量等价物,这意味着$x=h^{-1}*y$。但不幸的是,我无法在python中实现这一点 例如,让我们首先在MATLAB中执行此操作: clear all clc h = (randn(4,4) + 1j*randn(4,4)); %any matrix of
h
,大小4x4
,和一个向量x
,大小4x1
,如果我们有y
是h
和x
之间的乘法输出,这意味着y=h*x代码>其大小为1 x 4
。因此,当我将h
中每列的倒数乘以向量y
时,我应该能够得到向量x
的向量等价物,这意味着$x=h^{-1}*y$
。但不幸的是,我无法在python中实现这一点
例如,让我们首先在MATLAB中执行此操作:
clear all
clc
h = (randn(4,4) + 1j*randn(4,4)); %any matrix of 4 x 4
x = [1 + 1j ; 0; 0 ; 0]; % a vector of 4 x 1
y = h * x ; % y is the output of multiplication
x2 = [];
for ii = 1 : 4
x1 = pinv(h(:,ii))*y; %multiply every column of h^(-1) with y
x2 = [x2 x1]; % the output
end
在这种情况下,输出x2
与预期一样,向量1 x 4
如下所示:
x2 =
1.0000 + 1.0000i 0.7249 + 0.5054i -0.0202 + 0.0104i 0.2429 + 0.0482i
在MATLAB中,这没关系
现在让我们在python中实现这一点:
import numpy as np
h = np.random.randn(4,4) + 1j*np.random.randn(4,4)
x = [[1+1j],[0+0j],[0+0j],[0+0j]]
y = h.dot(x)
x2 = []
for ii in range(4):
x1 = np.divide(y, h[:,ii])
x2.append(x1)
print(x2)
虽然x2
应该是一个维度向量1 x 4
类似于上述MATLAB代码的输出,但在这种情况下,我得到了x2
一个大小为4 x 4
的矩阵
请帮忙 这里有两个问题:
- 是元素级的除法,您可能会寻找
- MATLAB是col-major(FORTRAN风格),而NumPy是row-major(C风格),因此获得一个作为NumPy数组的
列表将使您获得一个(n,)
形状,该形状具有n
列表的长度,而不是像MATLAB那样的大小(1,n)
与MATLAB代码等价的Python代码(我将进行预分配)是:
import numpy as np
h = np.random.randn(4, 4) + 1j * np.random.randn(4, 4)
x = np.array([[1 + 1j], [0 + 0j], [0 + 0j], [0 + 0j]])
# y = h.dot(x) <-- now NumPy supports also `@` in place of `np.dot()`
y = h @ x
x2 = np.zeros((1, 4), dtype=np.complex)
for i in range(4):
x2[0, i] = np.linalg.pinv(h[:, i:i + 1]) @ y
将numpy导入为np
h=np.random.randn(4,4)+1j*np.random.randn(4,4)
x=np.数组([[1+1j]、[0+0j]、[0+0j]、[0+0j])
#y=h.dot(x)有两个问题你弄错了:np.divide()
是元素方面的,MATLAB是col-major(FORTRAN风格),而NumPy是row-major(C风格)。尝试extend
而不是append
,@Renat,我试过了,但我得到了同样的问题@诺洛克那么,我该怎么解决这个问题呢?你的意思是直接使用y=h*x?我得到的最终输出也是4 x 4矩阵,而不是1 x 4的向量!