2011-10-18 112 views
31

Tôi đang cố gắng nhúng Python 2.6 vào MATLAB (7.12). Tôi muốn nhúng với một tập tin mex viết bằng C. Điều này làm việc tốt cho các ví dụ đơn giản nhỏ bằng cách sử dụng vô hướng. Tuy nhiên, nếu Numpy (1.6.1) được nhập vào thì MATLAB gặp sự cố. Tôi nói mà thôi vì tôi đã thử một số cách để tải các thư viện NumPy bao gồmNhúng Python vào MATLAB

  1. Trong mô-đun python (py):

    from numpy import * 
    
  2. Với PyRun_SimpleString trong file mex:

    PyRun_SimpleString(“from numpy import *”); 
    
  3. Gọi chức năng numPy với Py_oBject_CallObject:

    pOut = PyObject_CallObject(pFunc, pArgs); 
    

Ban đầu, tôi nghĩ rằng điều này có thể là một vấn đề với nhúng NumPy trong C. Tuy nhiên, numpy hoạt động tốt khi nhúng vào trong file C đơn giản mà được biên dịch từ dòng lệnh với MD (multithread) chuyển đổi/với Visual Trình biên dịch C, 2005. Tiếp theo, tôi nghĩ rằng tôi sẽ chỉ thay đổi tập tin thực hiện trong MATLAB để bao gồm các/MD chuyển đổi. Không may mắn như vậy, mexopts.bat biên dịch với công tắc/MD. Tôi cũng tự nhận xét ra dòng trong mô-đun init Numpy để tìm những gì đã bị rơi MATLAB. Dường như tải bất kỳ tệp nào có phần mở rộng pyd gặp sự cố MATLAB. Tệp đầu tiên được tải trong NumPy là multiarray.pyd. Tài liệu MATLAB mô tả cách gỡ lỗi các tệp mex với các studio trực quan mà tôi đã làm và đặt thông báo lỗi bên dưới. Tại thời điểm này tôi biết vấn đề là một vấn đề bộ nhớ với pyd và một số xung đột với MATLAB. Thật thú vị, tôi có thể sử dụng một lệnh hệ thống trong MATLAB để khởi động một quá trình trong python có sử dụng numpy và không có lỗi được tạo ra. Tôi sẽ dán bên dưới thông báo lỗi từ MATLAB theo sau là đầu ra DEBUG trong các studio trực quan của các quá trình gặp sự cố MATLAB. Tuy nhiên, tôi không dán toàn bộ điều vì danh sách các trường hợp ngoại lệ đầu tiên rất dài. Có bất kỳ đề xuất nào để giải quyết vấn đề tích hợp này không?

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. 

Output từ Visual Studio 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

Điều này có thể sẽ không dễ dàng để theo dõi. Một lý do có thể là một số xung đột với việc tải nhiều thư viện thời gian chạy C (một cho Python, một cho Matlab và có thể là một đối tượng khác cho Numpy). Đầu tiên gợi ý: bạn nói rằng bất kỳ tập tin .pyd bị treo. Bạn đã thử những người không từ Numpy? Bước đầu tiên là làm cho phần cơ bản này hoạt động, và chỉ sau khi di chuyển để cố gắng làm cho Numpy (phức tạp hơn) để làm việc.(Nếu giải quyết điều này là quá nhiều công việc, kế hoạch B sẽ là chạy Python trong một quá trình riêng biệt, và sử dụng một số phương pháp IPC để giao tiếp với Matlab.) –

+0

Điểm tốt. Tùy chọn đầu tiên khi bạn đề cập là đi theo chuỗi .pyd đến mặt đất. Tuy nhiên, điều đó có thể liên quan đến việc kiểm tra và có thể viết lại các tệp pyd đã biên dịch C. Phải mất một dòng mã để lưu tệp .mat trong MATLAB (lưu 'dữ liệu', 'biến', '-v7') (phải được lưu ở định dạng trước đó để tương thích với Python) và một dòng mã để đọc nó trong Python (biến = loadmat ('data.mat')) với gói Scipy (từ scipy.io importmat). Ngoài ra, có vẻ như được viết nhiều hơn về việc đóng gói các hàm MATLAB trong Python, đó là những gì tôi sẽ thử. –

+1

Tôi muốn nói rằng tránh nhúng là khóa học tốt hơn. Một vài năm trở lại tôi đã viết một tập tin MEX nhúng Python bên trong Matlab, và có tất cả mọi thứ làm việc. (Điều này đã được trên Unix, mặc dù, google "pythoncall".) Có vấn đề với tải các mô-đun nhị phân Python (.pyd/.so) cũng có, nhưng với một số công việc những người có thể được giải quyết. Tuy nhiên, nó không hoạt động với phiên bản Matlab tiếp theo --- tổng thể, cảm thấy như một thiết lập khá dễ vỡ. –

Trả lời

5

Cố gắng tiếp cận vấn đề từ phía Python: Python là một ngôn ngữ keo tuyệt vời, tôi sẽ đề nghị bạn có Python chạy Matlab và C của bạn chương trình. Python có:

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

Như vậy, sự kết hợp là một lựa chọn tốt cho hầu hết các mô-đun Matlab hiện có.

+2

Mặc dù đặt thường dân, đây là loại sai lầm nhất, vô dụng và xúc phạm trả lời. Xúc phạm vì nó gán xác suất khác 0 cho khả năng op không nghĩ về điều này. Vô dụng vì nó bỏ qua "các vấn đề nền tảng, chuỗi công cụ độc quyền, cổng chứng nhận, công nghệ được cấp phép và các yêu cầu nghiêm ngặt về hiệu suất trên các vấn đề về tính khả dụng và nhân lực kế thừa" (John Carmack) mà op có thể đang gặp phải. Và sai lầm bởi vì bạn có nghĩa là để giúp đỡ (nhưng chỉ không). –