关于每个数组除以 Python 中的范数

On the division of each array by its norm in Python

假设我有一个大小为4 x 4的矩阵H和一个大小为4 x 1的向量y,我需要在[=中得到(h'/norm(h, 'fro')) * y的结果29=],其中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: 1-dimensional array given. Array must be at least two-dimensional

也许这会如你所愿:

同样在你的代码中 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

我执行了您的 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,所以我们也需要转置。