使用Octave内置函数mldivide在c++ API

Using Octave built-in function mldivide in C++ API

本文关键字:c++ API mldivide 函数 Octave 内置 使用      更新时间:2023-10-16

我正在用c++编程,想要使用Octave中强大的内置函数。我遵循了Octave网站上的独立程序指南。我可以运行函数规范(在c++中称为Fnorm)与示例代码成功。现在我想用函数mldivide来解一个线性方程。

#include <iostream>
#include <octave/oct.h>
#include <octave/builtin-defun-decls.h>
octave_value_list input;
octave_value_list retval;
int main (void) {
Matrix A(4,4);
for (octave_idx_type i = 0; i < 4; i++)
   for (octave_idx_type j = 0; j < 4; j++)
    A(i,j) = 1.0 / (static_cast<double> (i) +static_cast<double> ( j ) + 1.0 ) ;
    ColumnVector b(4,1.0);
    input.append(A);
    input.append(b);
    retval=Fmldivide(input);
    ColumnVector x =retval(0).column_vector_value();
    std::cout << "A = " << std::endl << A << std::endl
              << "b = " << std::endl << b << std::endl
              << "x = " << std::endl << x << std::endl;
    return 0;
 }

但有以下错误。

main.cpp: In function 'int main()':
main.cpp:23:26: error: invalid initialization of reference of type 'const octave_value_list&' from expression of type 'Matrix'
In file included from main.cpp:3:0:
/usr/local/octave/3.8.0/include/octave-3.8.0/octave/../octave/builtin-defun-decls.h:198:1: error: in passing argument 1 of 'octave_value_list Fmldivide(const octave_value_list&, int)'

任何想法吗?

这不起作用有两个原因:

  1. Fmldivideoctave_value_list为输入

  2. Fmldivide返回octave_value_list,但您声明的是ColumnVector

你可以通过:

  1. 将您的输入转换为单个octave_value,并将转换为octave_value_list留给编译器:

  2. Fmldivide (octave_value (b), 1);
  3. 使用do_binary_op左除法运算符:

    do_binary_op (octave_value:: op_ldiv b 1);

您可以使用column_vector_value方法来修复第二个问题:

  1. 如果你使用Fmldivide,你得到一个列表,所以你必须先索引第一个元素:

    ColumnVector x = Fmldivide (b, 1)(0)。column_vector_value ();

  2. 如果你使用do_binary_op,你将得到一个octave_value,所以索引是不必要的:

    ColumnVector x = do_binary_op (octave_value::op_ldiv, b, 1).column_vector_value ();