Scipy 空空间 Innacurate 仅适用于复数值

问题描述 投票:0回答:1

我有一个程序,可以使用 scipy null_space 计算矩阵的零空间。当矩阵为实数时,我的代码工作绝对完美,但似乎与 MATLAB 中复杂矩阵的结果相矛盾。

举个例子,

[[ 1.        +0.j   0.        +0.j   0.        +0.j  -0.28867513+0.5j]
 [ 0.        +0.j   1.        +0.j   0.        +0.j  -0.28867513-0.5j]
 [ 0.        +0.j   0.        +0.j   1.        +0.j   0.57735027-0.j ]]

当插入 scipy.linalg.null_space 时,

[[ 0.24235958-0.32852474j]
 [ 0.16333098+0.37415192j]
 [-0.40569056-0.04562718j]
 [ 0.70267665+0.0790286j ]]

MATLAB 中完全相同的矩阵给出,

0.2235 - 0.3134i
0.1596 + 0.3502i
-0.4151 + 0.2949i
0.6636 + 0.0639i

这些在缩放方面显然不一样,那么发生了什么? scipy 对于复杂矩阵来说不是很准确还是我做错了什么?当矩阵恰好是真实的时,我的代码再次完美地工作。预先感谢!

python numpy matlab matrix scipy
1个回答
0
投票

嗯,你可以试试这个。当乘以矩阵 A 时,你的 scipy.null_space 向量正确地给出 0,而你的 Matlab 答案却没有。

元素的比例是一个常数(复数),除了第三行,这让我认为这是Matlab中错误的元素。

scipy.null_space 向量也正确标准化为 1。

我认为 scipy.null_space 给出了正确的结果,而你在 Matlab 中所做的任何事情都不是。

检查两个代码中的矩阵是否相同。

import numpy as np

A = np.array( [
                [ 1.+0.j,  0.+0.j,  0.+0.j, -0.28867513+0.5j],
                [ 0.+0.j,  1.+0.j,  0.+0.j, -0.28867513-0.5j],
                [ 0.+0.j,  0.+0.j,  1.+0.j,  0.57735027-0.j ]
              ] )

python = np.array( [
                     0.24235958-0.32852474j,
                     0.16333098+0.37415192j,
                    -0.40569056-0.04562718j,
                     0.70267665+0.0790286j 
                    ] )

matlab = np.array( [
                     0.2235 - 0.3134j,
                     0.1596 + 0.3502j,
                    -0.4151 + 0.2949j,
                     0.6636 + 0.0639j 
                    ] )

print(     'A @ python =\n', A @ python )
print( '\n\nA @ matlab =\n', A @ matlab )
print( '\n\npython / matlab =\n', python / matlab )
print( '\n\nabs(python) =\n', np.linalg.norm( python ) )

输出:

A @ python =
 [ 6.71328548e-09-6.37871800e-09j  6.71328548e-09+3.62128200e-09j
 -6.39980441e-09+3.54772201e-09j]


A @ matlab =
 [-1.48162680e-05-4.63408070e-05j -1.48162680e-05-4.63408070e-05j
 -3.19703608e-02+3.31792682e-01j]


python / matlab =
 [1.06043801+0.01707621j 1.06065285+0.01698805j 0.59761752+0.53448467j
 1.06051995+0.01697013j]


abs(python) =
 1.0000000015891697
© www.soinside.com 2019 - 2024. All rights reserved.