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

32

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

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

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

    PyRun_SimpleString("from numpy import *");
    
  • Вызов функций numpy с помощью 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 с визуальными студиями, которые я сделал, и помещал сообщение об ошибке ниже. На данный момент я знаю, что проблема связана с проблемой памяти с pyds и некоторым конфликтом с MATLAB. Интересно, что я могу использовать системную команду в MATLAB для запуска процесса на питоне, который использует 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 DEBUGGER

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
  • 1
    Это, вероятно, будет нелегко отследить. Возможная причина - конфликт с загрузкой нескольких библиотек времени выполнения C (одна для Python, другая для Matlab и, возможно, другая для Numpy). Первое предложение: вы говорите, что любой .pyd файл вылетает. Вы пробовали те, которые не от Numpy? Первым шагом было бы заставить эту базовую часть работать, и только после этого перейти к попытке заставить Numpy (что более сложно) работать. (Если решить эту проблему - слишком много работы, план Б заключался бы в том, чтобы запустить Python в отдельном процессе и использовать какой-либо метод IPC для связи с Matlab.)
  • 0
    Хорошая точка зрения. Первый вариант, как вы упомянули, заключается в том, чтобы следовать потоку .pyd на землю. Однако это может включать изучение и, возможно, переписывание скомпилированных p-файлов на языке Си. Требуется одна строка кода для сохранения файла .mat в MATLAB (сохранить «данные», «переменная», «-v7») (необходимо сохранить в более раннем формате для совместимости с Python) и одна строка кода для его чтения в Python (переменная = loadmat ('data.mat')) с пакетом Scipy (из scipy.io import loadmat). Кроме того, кажется, больше написано об обёртывании функций MATLAB в Python, что я и попробую.
Показать ещё 5 комментариев
Теги:
numpy
mex

2 ответа

5

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

  • Numpy
  • PyLab
  • Matplotlib
  • IPython

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

  • 3
    Несмотря на гражданский подход, это самый ошибочный, бесполезный и оскорбительный ответ. Обидно, потому что оно присваивает ненулевую вероятность тому, что опера не подумала об этом. Бесполезно, потому что игнорирует «кроссплатформенные проблемы, проприетарные цепочки инструментов, сертификационные ворота, лицензионные технологии и строгие требования к производительности, а также проблемы с устаревшими кодовыми базами и доступностью рабочей силы» (Джон Кармак), с которыми, вероятно, сталкивается операционная система. И заблуждается, потому что вы хотите помочь (но не можете).
0

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

Ещё вопросы

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