Я пытаюсь использовать scipy.optimize.differential_evolution
(python) из среды MATLAB.
До сих пор, я могу назвать differential_evolution
функцию. Единственная проблема заключается в том, что он явно не может получать дескрипторы функций MATLAB в качестве аргумента.
Я получаю следующую ошибку:
Ошибка при использовании py.scipy.optimize.differential_evolution Обрабатывать функцию MATLAB '@(x) x (1). ^ 2. * x (2). ^ 2' не поддерживается. Используйте дескриптор для функции Python.
Есть ли какой-то опрятный способ или функция "преобразовать" дескриптор функции MATLAB в функцию python, чтобы я мог использовать опрятную функцию оптимизации из scipy?
Я не уверен, но я подозреваю, что то, что вы хотите, не может быть сделано.
Во-первых, что-либо в интерфейсе python даст вам эту ошибку, если вы передадите анонимную функцию MATLAB:
>> py.print(@(x) x)
Error using py.print
Handle to MATLAB function '@(x)x' is not supported. Use a handle to a Python function.
Таким образом, кажется, что двигатель означает это, и вы должны отказаться от функций MATLAB. Мы могли бы попробовать преобразовать вашу анонимную функцию в python... но я не мог понять, как это возможно. Я подозреваю, что это невозможно вообще, так как самая простая и простая пользовательская функция будет лямбда. Но py.lambda
не существует, и мы не можем даже обмануть движок MATLAB, вызвав py.eval
:
>> py.lambda
Undefined variable "py" or class "py.lambda".
>> py.eval('lambda x: x')
Python Error: SystemError: frame does not exist
>> py.eval('def foo(x): return x')
Python Error: SystemError: frame does not exist
Это очень сильно говорит о том, что, как только у вас есть анонимная функция MATLAB, вы не можете превратить ее в python.
Прямой вопрос: вам действительно нужна анонимная функция MATLAB? Вы могли бы также использовать правильную функцию python (или лямбда) и передать другие аргументы основной функции scipy.optimize
как args
. Вы можете определить свою пользовательскую функцию в файле python и import
из MATLAB и использовать соответствующий дескриптор функции. Это был бы прямой выход из вашей ситуации.
Также обратите внимание, что, хотя нехватка поддержки функций функций MATLAB явно не упоминается среди ограничений, раздел документации, описывающий поддерживаемые типы данных, делает это замечание:
Тип аргумента входа MATLAB - только значения Scalar
функция handle @py.module.function, только для функций Python
Различие для функций Python соответствует тому, что даже самые простые функции Python отказываются принимать дескрипторы функций MATLAB.