Среда: Windows 7 Professional + октава 3.6.2 + Visual C ++
Я пытался встроить октаву в отдельную программу C ++ в соответствии с руководством:
http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html#Standalone-Programs
Мне удалось запустить первую программу без проблем, но вторая выдает сообщение об ошибке.
Упрощенная версия второй программы:
int main (void)
{
string_vector argv (2);
argv(0) = "embedded";
argv(1) = "-q";
octave_main (2, argv.c_str_vec(), 1);
Matrix a_matrix = Matrix (1, 2);
std::cout << "GCD of [12, 16] is ";a_matrix(0)=12;
a_matrix(1)=16;
octave_value_list in = octave_value (a_matrix);
octave_value_list out = feval ("gcd", in, 1);
std::cout<<out(0).matrix_value()<<std::endl;
return 0;
}
строка с «feval» не выполнена. Причина в том, что в октаве 3.6.2, функция gcd больше не принимает список значений в качестве параметра, нужно позвонить gcd (значение1, значение2, …) вместо gcd ([value1, value2, …]), который был поддержан еще в октаве 3.2.4, поэтому здесь возникает моя главная проблема:
Как я могу передать несколько параметров в feval как отдельные значения, чтобы я мог вызывать такие функции, как gcd (value1, value2, …) через C ++ API в octave?
В конечном счете, мне нужно выполнить некоторую обработку графики в приложении с графическим интерфейсом, поэтому мне может потребоваться вызвать такие функции, как conv2 на стороне C ++ (что, к сожалению, также требует нескольких параметров функции)
Спасибо заранее за любую помощь
Ну, я только что сделал замену ниже:
//octave_value_list in = octave_value (a_matrix);
octave_value_list in;
for (octave_idx_type i = 0; i < n; i++)
in(i) = a_matrix (i);
это работает … но я получаю jre ошибку.
Оказывается, прямо проезжая octave_value_list в качестве ввода вместо преобразования матрица в octave_value_list с octave_value, работает отлично. (Может быть, octave_value виновник?)
Так что рабочий код под октава 3.6.2 это так:
int main (void)
{
string_vector argv (2);
argv(0) = "embedded";
argv(1) = "-q";
octave_main (2, argv.c_str_vec(), 1);
std::cout << "GCD of [12, 16] is ";
// Use octave_value_list directly as input
octave_value_list in(2);
in(0)=12;
in(1)=16;
octave_value_list out = feval ("gcd", in, 1);
std::cout<<out(0).int_value()<<std::endl;
return 0;
}