从 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]),不管原来是什么类型的参数,都需要一个[]