首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中调用GNU函数?

在C中调用GNU函数?
EN

Stack Overflow用户
提问于 2019-05-16 20:32:30
回答 1查看 1.8K关注 0票数 2

我想使用矩阵代数和优化。我为矩阵代数测试了不同的C和C++库,但问题是它们不能像GNU那样处理垃圾数据。C和C++中的垃圾数据低到像e-8,但在Garbage中,它将被向下推到e-17的低点。如果您计划在计算中使用来自测量等的垃圾数据,这是非常有用的。他们对你的结果毫无影响。

但是GNU有一个C++ API,我并不真正理解如何使用它。但是我想使用C,并从C调用GNU函数。

我是否有可能创建一个包含二维数组和维度的结构,并将其发送到GNU Octave,然后我将再次返回一个具有结果和维度(例如,解决方案)的结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-18 09:20:50

有一个c- 梅克斯接口。但是,在调用任何mex函数之前,必须嵌入并初始化八度解释器。截至10月4日,octave_main已不再推荐使用链接答案,还需要进行其他一些更改,以使其对mex程序有用。因此,我准备了一个c++源文件calloctave.cc,其中包含函数mexCallOctavefree_arg_list及其头部calloctave.h

calloctave.cc

代码语言:javascript
复制
// calloctave.cc

#include "interpreter.h"
#include "mxarray.h"
#include "parse.h"

extern "C"
int
mexCallOctave (int nargout, mxArray *argout[], int nargin,
               mxArray *argin[], const char *fname)
{

  static octave::interpreter embedded_interpreter;
  if (!embedded_interpreter.initialized())
    embedded_interpreter.execute ();

  octave_value_list args;

  args.resize (nargin);

  for (int i = 0; i < nargin; i++)
    args(i) = mxArray::as_octave_value (argin[i]);

  bool execution_error = false;

  octave_value_list retval;


  retval = octave::feval (fname, args, nargout);

  int num_to_copy = retval.length ();

  if (nargout < retval.length ())
    num_to_copy = nargout;

  for (int i = 0; i < num_to_copy; i++)
    {
      argout[i] = new mxArray (retval(i));
    }

  while (num_to_copy < nargout)
    argout[num_to_copy++] = nullptr;

  return execution_error ? 1 : 0;
}

extern "C"
void 
free_arg_list (int nargs, mxArray* arglist[])
{
    for(int i = 0; i < nargs; i++)
            delete arglist[i];
}

calloctave.h

代码语言:javascript
复制
// calloctave.h
#pragma once
#include "mex.h"

#if defined  (__cplusplus)
extern "C" {
#endif

int
mexCallOctave (int nargout, mxArray *argout[], int nargin,
               mxArray *argin[], const char *fname);
void 
free_arg_list (int nargs, mxArray* arglist[]);

#if defined  (__cplusplus)
}
#endif

这里是对mex文件的基本介绍。您可以编译一个示例hello程序,将选项--verbose添加为mkoctfile --mex --verbose hello.c,以获得用于编译实际程序所需的编译器选项列表。注意,因为calloctave.cc是c++源代码,所以应该使用c++编译器(如g++ )编译它。在下面的示例中,调用m函数"myfunction“。它得到一个输入并产生一个输出。mexCallOctave用于调用八度函数,它具有与mexCallMATLAB相同的签名。

myfunction.m

代码语言:javascript
复制
% myfunction.m
function out=  myfunction( a )
    out = sum(a);
endfunction

main.c

代码语言:javascript
复制
//main.c
#include <stdio.h>
#include "calloctave.h"   
int main()
{
    double input_data[] = {0,1,2,3,4,5,6,7,8,9,10};

    const int nargin = 1;
    const int nargout = 1;
    mxArray* rhs[nargin];
    mxArray* lhs[nargout];

    // allocate mex array
    rhs[0] = mxCreateDoubleMatrix( 10, 1, mxREAL);
    double* rhs_ptr = mxGetPr( rhs[0] );

    // copy data from input buffer to mex array
    for (int i = 0 ; i < 10; i++)
        rhs_ptr[i] = input_data[i];

    // call octave function
    mexCallOctave(nargout, lhs, nargin, rhs, "myfunction");

    double* lhs_ptr = mxGetPr( lhs[0] );

    double output_data = *lhs_ptr;

    // show the result
    printf ("result = %f", output_data);

    // free memory

    mxDestroyArray(rhs[0]);
    free_arg_list(nargout, lhs);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56176203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档