关于每个数组在 Python 中按其范数划分



假设我有一个大小为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

相关内容

  • 没有找到相关文章

最新更新