Встраивание Python в MATLAB - PullRequest
       19

Встраивание Python в MATLAB

31 голосов
/ 18 октября 2011

Я пытаюсь встроить Python 2.6 в MATLAB (7.12). Я хотел внедрить mex-файл, написанный на C. Это хорошо работало для небольших простых примеров, использующих скаляры. Однако, если Numpy (1.6.1) импортируется в любом случае, MATLAB вылетает. Я говорю так или иначе, потому что я попробовал несколько способов загрузить библиотеку numpy, включая

  1. В модуле python (.py):

    from numpy import *
    
  2. С PyRun_SimpleString в файле mex:

    PyRun_SimpleString(“from numpy import *”);
    
  3. Вызов простых функций с помощью Py_oBject_CallObject:

    pOut  = PyObject_CallObject(pFunc, pArgs); 
    

Изначально я думал, что это может быть проблемой при встраивании Numpy в C. Однако Numpy прекрасно работает, когда встраивается в простые C-файлы, скомпилированные из командной строки с ключом / MD (многопоточность) с помощью компилятора Visual Studios 2005 C , Затем я подумал, что я просто изменю файл make в MATLAB, чтобы включить ключ / MD. Не повезло, mexopts.bat компилируется с ключом / MD. Я также вручную закомментировал строки в модуле инициализации Numpy, чтобы найти причину сбоя MATLAB. Похоже, что загрузка любого файла с расширением pyd вылетает из MATLAB. Первым из таких файлов, загружаемых в NumPy, является multiarray.pyd. Документация MATLAB описывает, как отлаживать mex-файлы в визуальных студиях, что я и сделал, и разместил сообщение об ошибке ниже. На данный момент я знаю, что проблема связана с памятью в pyd'ах и конфликтом с MATLAB. Интересно, что я могу использовать системную команду в MATLAB, чтобы запустить процесс в python, который использует numpy и не генерирует никаких ошибок. Я вставлю ниже сообщение об ошибке из MATLAB с последующим выводом DEBUG в визуальные студии процессов, которые приводят к сбою MATLAB. Однако, я не вставляю все это, потому что список исключений первого шанса очень длинный. Есть ли предложения по решению этой проблемы интеграции?

MATLAB error
Matlab has encountered an internal problem and needs to close 
MATLAB crash file:C:\Users\pml355\AppData\Local\Temp\matlab_crash_dump.3484-1:


------------------------------------------------------------------------
       Segmentation violation detected at Tue Oct 18 12:19:03 2011
------------------------------------------------------------------------

Configuration:
  Crash Decoding  : Disabled
  Default Encoding: windows-1252
  MATLAB License  : 163857
  MATLAB Root     : C:\Program Files\MATLAB\R2011a
  MATLAB Version  : 7.12.0.635 (R2011a)
  Operating System: Microsoft Windows 7
  Processor ID    : x86 Family 6 Model 7 Stepping 10, GenuineIntel
  Virtual Machine : Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode
  Window System   : Version 6.1 (Build 7600)

Fault Count: 1

Abnormal termination:
Segmentation violation

Register State (from fault):
  EAX = 00000001  EBX = 69c38c20
  ECX = 00000001  EDX = 24ae1da8
  ESP = 0088af0c  EBP = 0088af44
  ESI = 69c38c20  EDI = 24ae1da0

  EIP = 69b93d31  EFL = 00010202

   CS = 0000001b   DS = 00000023   SS = 00000023
   ES = 00000023   FS = 0000003b   GS = 00000000


Stack Trace (from fault):
[  0] 0x69b93d31 C:/Python26/Lib/site-packages/numpy/core/multiarray.pyd+00081201 ( ???+000000 )
[  1] 0x69bfead4 C:/Python26/Lib/site-packages/numpy/core/multiarray.pyd+00518868 ( ???+000000 )
[  2] 0x69c08039 C:/Python26/Lib/site-packages/numpy/core/multiarray.pyd+00557113 ( ???+000000 )
[  3] 0x08692b09                           C:/Python26/python26.dll+00076553 ( PyEval_EvalFrameEx+007833 )
[  4] 0x08690adf                           C:/Python26/python26.dll+00068319 ( PyEval_EvalCodeEx+002255 )



This error was detected while a MEX-file was running. If the MEX-file
is not an official MathWorks function, please examine its source code
for errors. Please consult the External Interfaces Guide for information
on debugging MEX-files.

If this problem is reproducible, please submit a Service Request via:
    http://www.mathworks.com/support/contact_us/

A technical support engineer might contact you with further information.

Thank you for your help. 

Вывод из Visual Studios ОТЛАДКА

First-chance exception at 0x0c12c128 in MATLAB.exe: 0xC0000005: Access violation reading location 0x00000004.
First-chance exception at 0x0c12c128 in MATLAB.exe: 0xC0000005: Access violation reading location 0x00000004.
First-chance exception at 0x0c12c128 in MATLAB.exe: 0xC0000005: Access violation reading location 0x00000004.
First-chance exception at 0x751d9673 in MATLAB.exe: Microsoft C++ exception: jitCgFailedException at memory location 0x00c3e210..
First-chance exception at 0x751d9673 in MATLAB.exe: Microsoft C++ exception: jitCgFailedException at memory location 0x00c3e400..
First-chance exception at 0x69b93d31 in MATLAB.exe: 0xC0000005: Access violation writing location 0x00000001.
> throw_segv_longjmp_seh_filter()
throw_segv_longjmp_seh_filter(): invoking THROW_SEGV_LONGJMP SEH filter
> mnUnhandledWindowsExceptionFilter()
MATLAB.exe has triggered a breakpoint

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Попытайтесь подойти к проблеме со стороны Python: Python - отличный язык для склеивания, я бы посоветовал вам запустить Python для ваших программ на Matlab и C.Python имеет:

  1. Numpy
  2. PyLab
  3. Matplotlib
  4. IPython

Таким образом, сочетание является хорошимальтернатива практически для любого существующего модуля Matlab.

0 голосов
/ 18 марта 2015

С помощью matlab 2014b была добавлена ​​возможность вызывать функции Python непосредственно в коде m.

...