Метки

, , , ,

Бесплатный пакет математических вычислений octave можно подключать напрямую в программы, написанные на C++. Исчерпывающий пример как это сделать — тут и тут на сайте разработчиков, который продублирую сюда.

Функция, которую будем вызывать:

       function [resultScalar, resultString, resultMatrix] = exampleOctaveFunction (inScalar, inString, inMatrix)
       resultScalar = (inScalar * pi);
       resultString = strcat ('Good morning Mr. ', inString);
       resultMatrix = (inMatrix + 1);
    endfunction

В ней три входных и выходных параметра трёх различных типов (скаляр, строка и матрица).

Вызов происходит следующим образом.

#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/parse.h>
#include <octave/toplev.h> /* do_octave_atexit */
#include <iostream>

    int main (const int argc, char ** argv)
    {
      const char * argvv [] = {"" /* name of program, not relevant */, "--silent"};

      octave_main (2, (char **) argvv, true /* embedded */);

      octave_value_list functionArguments;

      functionArguments (0) = 2;
      functionArguments (1) = "D. Humble";

      Matrix inMatrix (2, 3);

      inMatrix (0, 0) = 10;
      inMatrix (0, 1) = 9;
      inMatrix (0, 2) = 8;
      inMatrix (1, 0) = 7;
      inMatrix (1, 1) = 6;

      functionArguments (2) = inMatrix;

      const octave_value_list result = feval ("exampleOctaveFunction", functionArguments, 1);

      std::cout << "resultScalar is " << result (0).scalar_value () << std::endl;
      std::cout << "resultString is " << result (1).string_value () << std::endl;
      std::cout << "resultMatrix is\n" << result (2).matrix_value ();

      do_octave_atexit ();

    }

Makefile для компиляции:

    OCTAVE_INCLUDE_DIR=/usr/include/octave-3.8.2/
OCTAVE_LIB_DIR=/usr/lib/octave/3.8.2

    makefile:
    all: octcall

    clean:
       -rm octcall.o octcall

    octcall: octcall.o
       g++ -L$(OCTAVE_LIB_DIR) -l octinterp -l octave -o octcall octcall.o

    octcall.o: how-to-call-octave.cpp
       g++ -c -I$(OCTAVE_INCLUDE_DIR) -I$(OCTAVE_INCLUDE_DIR)octave -o octcall.o how-to-call-octave.cpp

Если программа пишется в Qt, то в pro-файл необходимо добавить строку
LIBS+= -L/usr/lib/octave-3.2.4/ -lcruft -loctave -loctinterp
В ней /usr/lib/octave-3.2.4/ путь к библиотекам libcruft.so, liboctave.so, liboctinterp.so у меня на компьютере.

Чтобы не писать всякий раз при включении хеадеров полные пути, туда же можно добавить переменную
INCLUDEPATH += /usr/include/octave-3.2.4/

Update 18/07/2011:

Справка по классам liboctave: http://www.chemie.fu-berlin.de/chemnet/use/info/octave/liboctave_toc.html

Update 03/09/2016:

Текущая установленная версия 3.8.2 + необходимость флага -l octave в мейкфайле

Реклама