Метки
Бесплатный пакет математических вычислений 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.0.1/
OCTAVE_LIB_DIR=/usr/lib/octave-3.0.1/
makefile:
all: octcall
clean:
-rm octcall.o octcall
octcall: octcall.o
g++ -L$(OCTAVE_LIB_DIR) -l octinterp -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

