关于#python#,matlab nan的问题,如何解决?

python调用matlab文件的过程中,matlab文件返回了一个一维数组,但是在python中输出却是全为nan
python调用文件如下

from __future__ import print_function
import Detal_R2
import matlab
import matplotlib.pyplot as plt
import numpy as np

my_Detal_R2 = Detal_R2.initialize()

waveIn = matlab.double([0.000004], size=(1, 1))
IIn = matlab.double([1.35 * 10 ^ 18], size=(1, 1))
detal_ROut = my_Detal_R2.detal_R2(waveIn, IIn)
y = np.array(detal_ROut)
x = np.linspace(0, 20 * 10 ^ -12, 300)
plt.plot(x, y)
plt.show()

my_Detal_R2.terminate()

python在cmd中输出如下:

[[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],
[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[
nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[n
an],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[na
n],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan
],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan]
,[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],
[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[
nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan],[nan]]


在Python中输出的结果显示全部为NaN,这可能是因为在MATLAB中返回的double数组中的元素被自动转换为NaN,这可能是由于MATLAB中的NaN和Python中的NaN之间的差异引起的。您可以在Python中通过检查每个元素来确认是否是NaN,这可以通过使用numpy库中的numpy.isnan()函数来完成。

import numpy as np
...
y = np.array(detal_ROut)
print(np.isnan(y).any()) # Check if any element in y is NaN


如果结果为True,则意味着y中至少有一个元素是NaN,否则为False。如果结果为True,则可以尝试在MATLAB中进行调试,以查看生成的数组中的元素是否正确。

参考GPT和自己的思路,似乎 Matlab 函数 detal_R2 的输出是 NaN 值的矩阵,这就是 Python 输出也显示所有 NaN 值的原因。

1 Matlab 函数可能返回 NaN 值的原因有多种。 这可能是由于输入无效或函数本身的实现存在问题。 以下是您可以尝试解决问题的一些方法:

2 检查输入:确保输入 waveIn 和 IIn 有效且在预期值范围内。 此外,检查输入数组的大小和形状是否与函数兼容。

3 检查 Matlab 函数的实现:检查 detal_R2 函数的实现中是否存在任何可能导致其返回 NaN 值的错误或问题。 您可以尝试使用相同的输入在 Matlab 中运行该函数,看看它是否返回预期的输出。

4 检查函数是否返回任何错误消息:有时,如果存在未正确处理的错误或警告,函数可能会返回 NaN 值。 检查 Matlab 函数是否返回任何可能导致问题的错误消息或警告。
问题也可能出在您初始化 matlab.double 变量时的方式上。

具体来说,您的代码如下:

waveIn = matlab.double([0.000004], size=(1, 1))
IIn = matlab.double([1.35 * 10 ^ 18], size=(1, 1))

这里的问题在于 1.35 * 10 ^ 18 中的乘方符号 ^ 实际上是按位异或(XOR)符号,而不是乘方符号。因此,这里的计算结果可能并不是您所期望的。

要解决这个问题,可以使用 ** 符号来表示乘方。另外,您也可以将数字拆分为两个部分,分别相乘,这样可以避免使用乘方符号。例如:

waveIn = matlab.double([0.000004], size=(1, 1))
IIn = matlab.double([1.35e18], size=(1, 1))

这样,您就可以正确地初始化这些变量,并将正确的数据传递给 detal_R2 函数。

该回答引用ChatGPT

根据你提供的信息,问题可能是由于 Matlab 函数返回的数据类型不兼容 Python 所使用的数据类型导致的。具体来说,Matlab 函数可能返回的是一个 double 数组,而 Python 中的 numpy 数组默认是 float 类型的。这可能会导致精度问题和 NaN 的出现。

为了解决这个问题,你可以将返回的 Matlab 数组转换为 Python 的 numpy 数组时指定数据类型为 float。可以使用 np.float64 或者 np.float32。

修改代码如下:



from __future__ import print_function
import Detal_R2
import matlab
import matplotlib.pyplot as plt
import numpy as np
 
my_Detal_R2 = Detal_R2.initialize()
 
waveIn = matlab.double([0.000004], size=(1, 1))
IIn = matlab.double([1.35 * 10 ^ 18], size=(1, 1))
detal_ROut = my_Detal_R2.detal_R2(waveIn, IIn)
y = np.array(detal_ROut, dtype=np.float64)
x = np.linspace(0, 20 * 10 ^ -12, 300)
plt.plot(x, y)
plt.show()
 
my_Detal_R2.terminate()

这样应该就能够得到正确的数据了。

matlab中的数据类型为double型,1.35*10^18 没有超过double类型的上限,但转化到python中默认数据类型为float,超出范围,可能显示为Nan;

你是怎么运行成功不报错的? 修改代码如下:


from __future__ import print_function
import Detal_R2
import matlab
import matplotlib.pyplot as plt
import numpy as np

my_Detal_R2 = Detal_R2.initialize()

waveIn = matlab.double(0.000004, size=(1, 1))
IIn = matlab.double(1.35 * (10 ^ 18), size=(1, 1))
detal_ROut = my_Detal_R2.detal_R2(waveIn, IIn)
y = np.array(detal_ROut)
x = np.linspace(0, 20 * (10 ^ -12), 300)
plt.plot(x, y)
plt.show()

my_Detal_R2.terminate()

在Python中调用Matlab文件,如果返回的是一维数组,可以按照以下步骤进行:

确保Matlab文件中的数组类型为double类型,以确保Python可以正确读取。

在Matlab文件中,可以使用disp函数输出数组,以确保数组的值正确。

在Python中,使用scipy库中的sio模块来读取Matlab文件返回的数组,示例代码如下:


python
Copy code
import scipy.io as sio
# 读取Matlab文件
mat_data = sio.loadmat('your_matlab_file.mat')
# 获取数组
arr = mat_data['your_array_name'][0]
# 输出数组
print(arr)

需要注意的是,如果数组中存在NaN值,可能是由于Matlab文件中的计算结果超出了Python的数值范围,导致Python无法正确读取。可以在Matlab文件中使用isnan函数检查数组是否存在NaN值,并且检查计算结果是否超出了Python数值范围。另外,也可以在Python中使用numpy库来处理NaN值,例如使用numpy.nan_to_num函数将NaN值转换为0或其他数值。