在C ++ API中使用Octave内置函数mldivide

时间:2014-06-01 21:26:10

标签: c++ matlab octave

我使用C ++编程,并希望在Octave中使用强大的内置函数。我按照Octave网站上的standalone program指南进行了操作。我可以使用示例代码成功运行函数规范(在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 个答案:

答案 0 :(得分:1)

这有两个原因导致无效:

  1. Fmldivide需要octave_value_list作为输入

  2. Fmldivide返回octave_value_list,但您宣布ColumnVector

  3. 您可以通过以下方式修复第一个:

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

      Fmldivide(octave_value(b),1);

    2. do_binary_op与左分区运算符一起使用:

      do_binary_op(octave_value :: op_ldiv,b,1);

    3. 您可以使用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();