假设我有一个大小为4 x 4
的矩阵H
,以及大小为4 x 1
的向量 y,我需要在 Python 中得到(h'/norm(h, 'fro')) * y
的结果,其中h
是矩阵H
的列,h
' 是矩阵H
的每一列的转置。例如,在 MATLAB 中,我直接做了如下:
clear all
clc
H = [0.0937 + 1.5453i, -0.1910 - 0.3741i, 1.4420 + 0.6273i, 0.0518 - 0.4653i; ...
0.8537 + 0.9905i, -0.2910 + 0.0131i, 0.2993 - 0.5929i, 0.6426 + 0.4098i;...
0.3722 - 0.3470i, 0.0449 - 0.2985i, -0.7595 - 0.1346i, -1.2782 + 0.1877i; ...
-0.8256 + 0.5255i, -0.5318 - 0.0624i, -0.5467 - 0.4118i, 0.0772 + 0.9888i];
y = [0.1037 + 0.1302i; 0.3676 - 0.0198i; 0.2380 + 0.2824i; 0.0557 - 0.4222i];
re = [];
for ii = 1 : size(H,2)
nn = H(:,ii);
tt = (nn'/norm(nn,'fro') * y)
re = [re tt]
end
但是在 Python 中它给出了一个错误!我尝试如下:
import numpy as np
h = np.array([[0.0937 + 1.5453j, -0.1910 - 0.3741j, 1.4420 + 0.6273j, 0.0518 - 0.4653j],
[0.8537 + 0.9905j, -0.2910 + 0.0131j, 0.2993 - 0.5929j, 0.6426 + 0.4098j],
[0.3722 - 0.3470j, 0.0449 - 0.2985j, -0.7595 - 0.1346j, -1.2782 + 0.1877j],
[-0.8256 + 0.5255j, -0.5318 - 0.0624j, -0.5467 - 0.4118j, 0.0772 + 0.9888j]])
y = np.array([[0.1037 + 0.1302j], [0.3676 - 0.0198j], [0.2380 + 0.2824j], [0.0557 - 0.4222j]])
n = 3
re= np.zeros((1, 4), dtype=np.complex)
for ii in range(n):
re[:, ii] = ((np.linalg.pinv(h[:, ii])).transpose() / (np.linalg.norm(np.linalg.pinv(h[:, ii]), 'fro'))).dot(y)
但是我在运行re[:, ii] = ((np.linalg.pinv(h[:, ii])).transpose() / (np.linalg.norm(np.linalg.pinv(h[:, ii]), 'fro'))).dot(y)
的最后一个命令时出现错误,它说:
numpy.linalg.LinAlgError:给定一维数组。数组必须至少是二维的
我执行了您的 Matlab™ 代码来获取re
的这些值:
[0.098760-0.009564i, -0.316010+0.408531i, 0.139199+0.203590i, -0.264498-0.323802i]
这个 Python/Numpy 代码
import numpy as np
from numpy.linalg import norm
H = np.array(([ 0.0937 + 1.5453j, -0.1910 - 0.3741j, 1.4420 + 0.6273j, 0.0518 - 0.4653j],
[ 0.8537 + 0.9905j, -0.2910 + 0.0131j, 0.2993 - 0.5929j, 0.6426 + 0.4098j],
[ 0.3722 - 0.3470j, 0.0449 - 0.2985j, -0.7595 - 0.1346j, -1.2782 + 0.1877j],
[-0.8256 + 0.5255j, -0.5318 - 0.0624j, -0.5467 - 0.4118j, 0.0772 + 0.9888j]))
y = np.array([0.1037 + 0.1302j, 0.3676 - 0.0198j, 0.2380 + 0.2824j, 0.0557 - 0.4222j])
np.conjugate(H/norm(H, axis=0)).T@y
给
array([ 0.09875966-0.00956369j, -0.31600998+0.40853066j, 0.13919918+0.20358966j, -0.26449838-0.32380165j])
我认为这里的主要问题是在 Matlab™ 中转置复数组会为您提供转置共轭,在 Numpy 中转置相同的数组不会执行共轭。 另一个问题是 mat-vec 点积(@
运算符(是行列,而您需要 col-col,所以我们也需要换位。
也许这会做你想要的:
同样在您的代码中,n
应等于 4:
n = 4
for ii in range(n):
tmp1 = (h[:, ii]).transpose()
tmp2 = (np.linalg.norm(h[:, ii].transpose()))
re[:, ii] = (tmp1 / tmp2).dot(y)
请查看它是否会达到与 matlab 相同的结果。我修复了您的错误,但我不确定这是否是正确的计算。
我还从计算规范中删除了fro
,因为linalg.norm()
默认使用它,并且专门添加它会导致一些麻烦。有关更多详细信息,请参阅此处:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html