Вызвать функцию python, которая принимает дескриптор функции MATLAB в качестве аргумента от matlab

1

Я пытаюсь использовать 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?

Теги:
function
arguments

1 ответ

1
Лучший ответ

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

Во-первых, что-либо в интерфейсе 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.

  • 0
    Спасибо! Самым простым способом для меня будет сделать мой собственный метод diff_evolution (DE) в matlab. Первоначальная цель состояла в том, чтобы оптимизировать рабочие точки на оптоэлектронном устройстве. Измерение с шумом, я думаю, что DE лучше, чем обычные градиентные методы. Идея состояла в том, чтобы передать аргумент функции matlab, которая вызывает инструменты и измеряет устройство. Основным ограничением является то, что все драйверы инструментов уже закодированы в Matlab, и их повторное выполнение в Python займет некоторое время.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню