Вызов функции Matlab из python: "инициализатор должен быть прямоугольной вложенной последовательностью"

77
10

Я пишу скрипт python, из которого я надеюсь назвать функцию Matlab anovan. Я попытался выполнить базовый тест этой функции в файле 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 можно было бы назвать следующим:

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

Я вижу, что есть проблема в передаче последних двух столбцов массива функции, но я не уверен в решении. Мы ценим любые предложения.

спросил(а) 2021-01-25T17:23:11+03:00 4 месяца, 2 недели назад
1
Решение
64

Теперь я это сделал. Проблема была в формате данных, переданных функции.


#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)])

ответил(а) 2021-01-25T17:23:11+03:00 4 месяца, 2 недели назад
63

да, так и есть, параметр, передаваемый в функцию в MATLAB, должен быть такого типа: matlab.double([parameter]), необходимо matlab.double([parameter]) [] независимо от того, какого типа будет изначально параметр

ответил(а) 2021-01-25T17:23:11+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема