从 python 调用 Matlab 函数:"initializer must be a rectangular nested sequence"
Calling Matlab function from python: "initializer must be a rectangular nested sequence"
我正在编写一个 python 脚本,我希望从中调用 Matlab 方差分析函数。
我已在文件 test.txt
上尝试对此功能进行基本测试,其中包含 3 列:
1.472008228227131532e+01 1.000000000000000000e+00 1.000000000000000000e+00
1.423892587976163249e+01 2.000000000000000000e+00 1.000000000000000000e+00
1.434051782779769013e+01 3.000000000000000000e+00 1.000000000000000000e+00
1.478373164841650045e+01 4.000000000000000000e+00 1.000000000000000000e+00
1.463143763527341612e+01 5.000000000000000000e+00 1.000000000000000000e+00
1.580723346731706513e+01 6.000000000000000000e+00 1.000000000000000000e+00
1.964295632547030124e+01 1.000000000000000000e+00 2.000000000000000000e+00
1.922724696768608510e+01 2.000000000000000000e+00 2.000000000000000000e+00
1.886686329445662480e+01 3.000000000000000000e+00 2.000000000000000000e+00
1.960702674675711066e+01 4.000000000000000000e+00 2.000000000000000000e+00
1.983434584140020007e+01 5.000000000000000000e+00 2.000000000000000000e+00
2.050709640103466569e+01 6.000000000000000000e+00 2.000000000000000000e+00
此文件作为数组导入 data
。
在 matlab 中,方差分析函数的调用方式如下:
anovan(data(:,1),{data(:,2),data(:,3)})
在 python 中,我尝试这样调用函数:
import matlab.engine
eng = matlab.engine.start_matlab()
data = np.genfromtxt('test.txt')
eng.anovan(matlab.double(data[:,0]),matlab.int8(data[:,1:2]))
不幸的是,这会产生以下错误:
ValueError: initializer must be a rectangular nested sequence
我发现将最后两个数组列传递给函数时出现了一些问题,但我不确定解决方案。任何建议,将不胜感激。
我现在已经解决了这个问题。问题在于传递给函数的数据格式。
#convert grouping columns to integer lists
list1 = data[:,1].tolist()
for i in range(0,len(list1)):
list1[i] = int(list1[i])
list2 = data[:,2].tolist()
for i in range(0,len(list2)):
list2[i] = int(list2[i])
#The following command now works
eng.anovan(matlab.double(data[:,0].tolist()),[matlab.int8(list1),matlab.int8(list2)])
是的,就是MATLAB中传递给函数的参数应该是这样的类型:
matlab.double([parameter])
,不管原来是什么类型的参数,都需要一个[]
我正在编写一个 python 脚本,我希望从中调用 Matlab 方差分析函数。
我已在文件 test.txt
上尝试对此功能进行基本测试,其中包含 3 列:
1.472008228227131532e+01 1.000000000000000000e+00 1.000000000000000000e+00
1.423892587976163249e+01 2.000000000000000000e+00 1.000000000000000000e+00
1.434051782779769013e+01 3.000000000000000000e+00 1.000000000000000000e+00
1.478373164841650045e+01 4.000000000000000000e+00 1.000000000000000000e+00
1.463143763527341612e+01 5.000000000000000000e+00 1.000000000000000000e+00
1.580723346731706513e+01 6.000000000000000000e+00 1.000000000000000000e+00
1.964295632547030124e+01 1.000000000000000000e+00 2.000000000000000000e+00
1.922724696768608510e+01 2.000000000000000000e+00 2.000000000000000000e+00
1.886686329445662480e+01 3.000000000000000000e+00 2.000000000000000000e+00
1.960702674675711066e+01 4.000000000000000000e+00 2.000000000000000000e+00
1.983434584140020007e+01 5.000000000000000000e+00 2.000000000000000000e+00
2.050709640103466569e+01 6.000000000000000000e+00 2.000000000000000000e+00
此文件作为数组导入 data
。
在 matlab 中,方差分析函数的调用方式如下:
anovan(data(:,1),{data(:,2),data(:,3)})
在 python 中,我尝试这样调用函数:
import matlab.engine
eng = matlab.engine.start_matlab()
data = np.genfromtxt('test.txt')
eng.anovan(matlab.double(data[:,0]),matlab.int8(data[:,1:2]))
不幸的是,这会产生以下错误:
ValueError: initializer must be a rectangular nested sequence
我发现将最后两个数组列传递给函数时出现了一些问题,但我不确定解决方案。任何建议,将不胜感激。
我现在已经解决了这个问题。问题在于传递给函数的数据格式。
#convert grouping columns to integer lists
list1 = data[:,1].tolist()
for i in range(0,len(list1)):
list1[i] = int(list1[i])
list2 = data[:,2].tolist()
for i in range(0,len(list2)):
list2[i] = int(list2[i])
#The following command now works
eng.anovan(matlab.double(data[:,0].tolist()),[matlab.int8(list1),matlab.int8(list2)])
是的,就是MATLAB中传递给函数的参数应该是这样的类型:
matlab.double([parameter])
,不管原来是什么类型的参数,都需要一个[]