Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中矩阵的除法和乘法_Python_Matlab - Fatal编程技术网

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的向量!