Domanda Associazione Matlab di una libreria C ++ utilizzando SWIG


Sto già usando SWIG per portare alcune librerie C ++ in Python, e sono davvero colpito dalla qualità dei risultati. Quindi mi piacerebbe rimanere con SWIG ..

Recentemente qualcuno mi ha chiesto una porta Matlab. Tale idea era in realtà già nella mia lista di cose da fare.. ma ogni volta che ero googling per questo non ho trovato nulla di abbastanza stabile e di facile manutenzione (anche a causa delle mie scarse competenze con Matlab e dei suoi due modi per chiamare il codice C / C ++).

Dalla mia comprensione, c'è un modo non mantenuto e scarsamente documentato per farlo nel ramo principale, e molti altri tentativi su una tale direzione che non ha raggiunto abbastanza maturità per diventare parte del ramo principale: collegamento. Mi piacerebbe essere multipiattaforma, quindi non credo che il modo COM possa essere la soluzione per me.

Tuttavia, questa volta ho scoperto che c'è un ramo che sembra abbastanza promettente: collegamento Qualcuno ha già provato questa soluzione? Nel caso, un semplice esempio funzionante che chiama il codice C ++ portato da Matlab sarebbe molto utile ..

EDIT 1: Ho rimosso qualsiasi riferimento a C ++ 11

EDIT 2: The matlab ramo (citato nelle risposte) è attualmente in valutazione per essere fuso con il swig maestro (vedi: https://github.com/jaeandersson/swig/issues/72 e https://sourceforge.net/p/swig/mailman/message/35209729/ )


12
2017-10-30 23:07


origine


risposte:


Dato che faccio parte dell'impegno attuale di implementazione di un modulo MATLAB per SWIG (di cui ho scritto nella mail che hai collegato), potrei fornire un po 'di background e riportare lo stato a novembre 2014.

Ci sono stati diversi sforzi per implementare un modulo MATLAB per SWIG, utilizzando una varietà di approcci diversi. A partire da oggi (novembre 2014), nessuno di questi ha ancora avuto successo nel senso di essere incorporato nel ramo master di SWIG (speriamo di cambiarlo anche se in un futuro non troppo lontano, vedi sotto).

Come te, sto usando SWIG per portare un progetto C ++ (chiamato casadi) a Python e hanno seguito gli sviluppi del supporto MATLAB in SWIG per un paio di anni, poiché sarebbe molto utile per il nostro progetto. Dopo uno sforzo in cui ero un po 'coinvolto nel non riuscire a superare la fase di proof-of-concept, ho deciso di dargli un colpo da solo. Nell'aprile di quest'anno (2014), ho iniziato a scrivere codice ed è andata molto più agevolmente di quanto mi aspettassi. Dopo circa 2 settimane di programmazione, ho già implementato le funzionalità di base (funzioni di wrapping, classi e così via), che ho inviato alla community di SWIG. Sono stato felice di vedere molte risposte positive dalla lista SWIG e ancora più felice di vedere che persone come Kris (vedi la sua risposta) si uniscono allo sforzo e danno un grande contributo.

Lo stato del modulo in questo momento è che ha implementato la maggior parte delle funzionalità e si è utilizzato con successo per CasADi e altri progetti. Per me, dimostra chiaramente che l'approccio scelto è quello giusto anche se c'è ancora del lavoro da fare prima che il modulo sia stabile e documentato. Spero di essere in grado di fare un'altra spinta e in realtà riuscire a portare il modulo SWIG in uno stato in cui può essere incorporato nel master branch di SWIG. Ma questo dipende da se / quando riuscirò a ottenere fondi per lavorare su questo. Sono fiducioso che potrebbe accadere abbastanza presto comunque.

Infine, la tua domanda menziona C ++ 11. Questo è davvero un problema piuttosto separato dal lavoro sul modulo MATLAB. Le cose che coinvolgono C ++ 11 sono per lo più curate in SWIG in una questione che è indipendente dalla lingua a cui stai trasmettendo. Quindi consulta il supporto C ++ 11 in SWIG in generale.


8
2017-11-09 19:10



Come hai scoperto, ci sono state alcune attività recenti per SWIG e MATLAB. Questo è stato avviato da Joel Andersson (sulla base degli sforzi precedenti) e da allora ho aiutato. Siamo entrambi fuori tempo, ma abbiamo fatto in modo che funzionasse in uno stato ragionevole. Alcune persone lo hanno già usato per avvolgere il codice C ++ "di produzione". Purtroppo, non abbiamo un elenco TODO facile da nessuna parte, ma controlliamo le conversazioni nella lista di swig-devel.

Usando questo da MATLAB è abbastanza facile. Puoi trovare esempi in swig / Doc / Examples / matlab /. La suite di test ne ha alcuni di più.

Per costruire semplici esempi, puoi semplicemente eseguire swig per generare il file mex C ++ e poi da matlab do

mex yourModuleWrap.cxx

Per cose più complicate, dovrai aggiungere la tua libreria al file mex. Nell'elenco swig-devel, troverai anche file di esempio per l'utilizzo di CMake.

HTH

Kris


4
2017-11-09 10:18



Anch'io ho aiutato un po 'con l'integrazione di MATLAB con swig, anche se principalmente come tester. Puoi seguire le istruzioni per interfacciare la mia libreria (CoolProp) usando SWIG seguendo le istruzioni a: http://www.coolprop.dreamhosters.com:8010/sphinx/

Approssimativamente il processo è questo:

  1. Compilare una versione di swig che include il supporto matlab. C'è uno script di costruzione qui: https://github.com/CoolProp/CoolProp/blob/master/dev/scripts/build_swig_matlab.py
  2. Usando questa versione speciale di swig, compilare come normale. Usiamo CMake, quindi uno snippet approssimativo per far sì che tutto funzioni bene insieme è qualcosa come:

`` `

if (COOLPROP_MATLAB_SWIG_MODULE)

  # Must have SWIG
  FIND_PACKAGE(SWIG REQUIRED)
  INCLUDE(${SWIG_USE_FILE})

  find_package(Matlab REQUIRED)

  IF(MATLAB_FOUND)
      message(STATUS "MATLAB Found, MATLAB MEX will be compiled.")
  ELSE(MATLAB_FOUND)
      MESSAGE("MATLAB not found...nothing will be built.")
  ENDIF(MATLAB_FOUND)

  set(I_FILE "${CMAKE_SOURCE_DIR}/src/CoolProp.i")

  list (APPEND APP_SOURCES ${CMAKE_SOURCE_DIR}/wrappers/MATLAB/Matlabdef.def) # To export mexFunction

  SET_SOURCE_FILES_PROPERTIES(${I_FILE} PROPERTIES CPLUSPLUS ON)

  SWIG_ADD_MODULE(CoolPropMATLAB_wrap matlab ${I_FILE} ${APP_SOURCES})
  SWIG_LINK_LIBRARIES(CoolPropMATLAB_wrap ${MATLAB_LIBRARIES})

  add_definitions(/DMATLAB_MEX_FILE) #define matlab macros
  add_definitions(/DMX_COMPAT_32)

  add_custom_command(TARGET CoolPropMATLAB_wrap
                     POST_BUILD
                     COMMAND 7z a "+CoolProp.7z" "+CoolProp"
                     WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")

  if(WIN32) # 32-bit or 64-bit mex
    if (CMAKE_CL_64)
        SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexw64)
    else()
        SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES SUFFIX .mexw32)
    endif()
  else()
    if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
        if (${BITNESS} EQUAL "32")
            SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexmaci32 PREFIX "")
        elseif((${BITNESS} EQUAL "64"))
            SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexmaci64 PREFIX "")
        endif()
    else()
        if (CMAKE_SIZEOF_VOID_P MATCHES "8")
            SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexa64 PREFIX "")
        else()
            SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexglx PREFIX "")
        endif()
    endif()
  endif()
  add_dependencies (CoolPropMATLAB_wrap generate_headers)
  install (FILES ${CMAKE_CURRENT_BINARY_DIR}/+CoolProp.7z DESTINATION ${CMAKE_INSTALL_PREFIX}/MATLAB)
  install (TARGETS CoolPropMATLAB_wrap DESTINATION ${CMAKE_INSTALL_PREFIX}/MATLAB)
endif()

`` `

  1. Carica il modulo compilato in MATLAB

4
2017-11-10 22:11