Вызвать функцию Python из Matlab, которая использует глобальные переменные, ранее определенные в среде Python - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь вызвать из Matlab пользовательскую функцию, которая ссылается на переменные, ранее определенные в Python.

Последовательность событий следующая:

  1. Определитьпеременные в Python, включая функцию (fminconMaster_py), которая использует 2 анонимные функции, которые принимают аргумент 'x' (fun_py, obj_py)

  2. Вызов функции Matlab (optim_mat), которая использует алгоритм fminconдля задачи оптимизации - эта задача оптимизации имеет 2 анонимные функции (fun_mat, obj_mat), определенные в Matlab (цель и ограничения)

  3. Всякий раз, когда целью Matlab и ограничениями являются анонимные функции (fun_mat, obj_mat)Вызванные подпрограммой fmincon, они указывают на функцию matlab (fupdate), которая вызывает fminconMaster_py, который, в свою очередь, ссылается на анонимную функцию python fun_py и obj_py

Проблема заключается в том, что когда происходит 3, fminconMaster_py, определенный в Python, не распознает fun_py и obj_py ("Python Error: NameError: имя xxx не определено ")

См. код ниже

Python-код для fminconMaster_py (вызов fun_py и obj_py)

def fminconMaster_py(x):

    validNonLinearUpperConstraint =  Cu != np.Inf
    validNonLinearLowerConstraint = Cl != -np.Inf

    nonLinearUpperConstraint = Cu[validNonLinearUpperConstraint]
    nonLinearLowerConstraint = Cl[validNonLinearLowerConstraint]

    cUpper = fun_py (x)[validNonLinearUpperConstraint] - nonLinearUpperConstraint
    cLower = nonLinearLowerConstraint - fun_py (x)[validNonLinearLowerConstraint]

    c= np.vstack(cUpper, cLower)   
    obj = obj_py(x)

    return obj, c

Matlab-код для fupdate

pyfunction='pythonModule.fminconMaster_py' 

function [J, cin, gJ, gcin] = fupdate(x)
    eval(['output = py.', pyfunction, '(x);'])  
    ...
end

Ошибка возникает, когда fupdate вычисляет выражение, поскольку некоторые переменные не определены в fminconMaster_py (Cu, Cl, fun_py, obj_py).См. Вставленную ниже ошибку

Python Error: NameError: name 'Cu' is not defined

Error in optimize/obj (line 69)
    [J, cin, gJ, gcin] = fupdate(x);

Error in fmincon (line 546)
  initVals.f = feval(funfcn{3},X,varargin{:});

Error in optimize (line 34)
[xopt, fopt, exitflag, optoutput] = fmincon(@obj, x0, A, b, Aeq, beq, lb, ub, @con, opt);

Caused by:
Failure in initial objective function evaluation. FMINCON cannot continue.

Я мог бы передать Cu и Cl в качестве аргументов, поскольку они являются массивами, но fun_py и obj_py - сложные функции, которые я построил в Python

Любая идея, как это исправить?

1 Ответ

0 голосов
/ 18 октября 2018

Передайте их в функцию.

Вы не можете сделать это волшебством;Python не разделяет пространство имен ни с одной частью MATLAB - фактически, пространства имен Python зависят от модуля.Вам нужно будет передать их, заставив преобразовать их из представления одного языка в представление другого.


Что вы можете можете сделать, это определить функцию, которая загружает переменные вГлобальное пространство имен модуля Python.Что-то вроде:

def load_globals_py(d):
    globals().update(d)

Эта функция берет словарь, в котором ключи являются именами переменных, и добавляет их в глобальное пространство имен модуля.Вы можете вызвать это из MATLAB, прежде чем запускать другие функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...