在 C 中调用 GNU Octave 函数?

2023-12-14

我想使用矩阵代数和优化。我已经测试了不同的矩阵代数 C 和 C++ 库,但这些库的问题是它们不能像 GNU Octave 那样处理垃圾数据。 C 和 C++ 中的垃圾数据会降低到 e-8,但在 GNU Octave 中,它将降低到 e-17。如果您计划在计算中使用来自测量的垃圾数据,那么这非常有用。它们不会影响您的结果。

但是GNU Octave 有一个C++ API,我不太明白如何使用。但我想使用 C 并从 C 调用 GNU Octave 函数。

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


有一个cmex界面。然而,在调用任何 mex 函数之前,必须嵌入并初始化八度解释器。自 Octave 4.4 起octave_main正如建议的链接答案已被弃用,并且还需要进行一些其他更改才能使其对 mex 程序有用。所以我准备了一个c++源文件calloctave.cc包含函数mexCallOctave and free_arg_list及其标题calloctave.h.

calloctave.cc

// 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

// 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

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

myfunction.m

% myfunction.m
function out=  myfunction( a )
    out = sum(a);
endfunction

main.c

//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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 中调用 GNU Octave 函数? 的相关文章

随机推荐

  • 在 WPF 中我需要有一组绘图对象的集合

    我有一个 WPF 项目 它在面板中绘制多个内容 对于下一个版本 除了现有的东西之外 我还需要添加另一种类型的东西来绘制 目前我有一个包含 ItemsControl 的网格 其中包含 ItemsPanel 和 ItemsSource 现有的
  • 如何更改元素的文本而不更改其子元素?

    我想动态更新元素的文本 div text to change div
  • 准备好的语句,其中值在数组中

    在 php 页面中 我有一个数组 类似于 category array 16 22 23 然后我使用准备好的语句进行数据库查询 我想获取该字段所在的所有行category包含其中的值之一 category数组和哪里price低于变量中存储的
  • javascript 可以读取从应用程序脚本函数返回的字符串吗?

    在 Google Apps Script 中 我创建了一个函数 该函数返回一个包含电子表格文件 id 的字符串 该 id 因用户而异 因为它是从模板复制的新文件 function findSheet Opens User s Google
  • WinForms 光标仅在一个窗体上隐藏

    我有一个 C 应用程序 有 2 个同时可见的表单 当鼠标光标仅位于其中一个表单上时 我需要隐藏鼠标光标 如果我使用 Cursor Hide 它会对它们应用更改 您需要使用以下方法来实现此逻辑MouseEnter and MouseLeave
  • 无法使用 @ContextConfiguration(classes={ ... }) 加载 ApplicationContext

    我正在尝试使用 Java 和注释配置运行一些 spring 测试 我的测试包中有两个配置类 Configuration ComponentScan basePackages com mypackages public class TestC
  • 在Qt中使用QRubberBand裁剪图像

    我希望能够使用橡皮筋选择图像的区域 然后删除橡皮筋之外的图像部分并显示新图像 然而 当我目前这样做时 它不会裁剪正确的区域并给我提供错误的图像 include mainresizewindow h include ui mainresize
  • 使用 WPF 进行透视变换

    WPF 允许在图形对象上指定线性仿射变换 有了它 您可以进行平移 旋转 缩放 倾斜或它们的组合 您可以指定 2x3 矩阵 我想做的是 2D 空间中的透视变换 这需要 3x3 矩阵 并且从 Photoshop 或 GIMP 中得知 您可以在其
  • D3 库 — 本示例中如何从 JSON 访问数据

    我没有在标题中正确解释这个问题 抱歉 我正在关注 D3 标签云简单示例https github com jasondavies d3 cloud blob master examples simple html 我有一个 JSON 文件 其
  • 阻止 JSON.parse() 从 json 字符串数据中删除尾随零

    我创建了一个 JSON 字符串 如下所示
  • pthread 和 semaphore 在 osx maverick 10.9 中不适用于我

    我有以下涉及 pthread 和信号量的简单程序 我使用的是 os x Maverick 10 9 我使用 makefile 来编译程序 而不是 xcode 我使用c 11 include
  • 只需检查多个语句 C#

    目前正在开发一款小型主机游戏 想知道是否有人有一种简单的方法来缩短这样的内容 if map playerX 1 playerY R1 map playerX 1 playerY R2 map playerX 1 playerY R3 map
  • 如何在 SQL Server 中使用 NOT IN 创建过滤索引

    我想创建唯一的非聚集索引 它限制特定列的某些记录 我使用 NOT IN 来过滤它 但由于 NOT IN 我收到错误 有什么替代方法可以做到这一点 CREATE UNIQUE NONCLUSTERED INDEX UN Student ON
  • rabbitmq中预取计数与无ack有什么区别

    我需要知道rabbitmq中预取计数与无ack之间有什么区别 还 以下陈述有什么区别 如果我设置预取计数为 10 是否会创建 10 个消费者线程 或者 如果我注册 10 个消费者 它会创建 10 个线程吗 以上哪种方式效率更高 专门针对 s
  • SVN for Emacs:如何设置作者姓名和保存密码?

    我似乎无法在谷歌任何地方找到这个 我正在尝试从 eclipse 迁移到 emacs 但我一生都无法弄清楚如何设置我的 svn 作者姓名 这样它就不会默认作者姓名或保存密码 这样我就不必输入它在任何一次 如果这很重要的话 我是 Ubuntu
  • 如何通过cleartool命令将文件夹中的所有文件添加到源代码管理中?

    我有一个文件夹 其中有很多文件和子文件夹 通过 UI 将其添加到源代码管理会消耗很多时间 如何使用cleartool将所有文件 包括子文件夹内的文件 添加到源代码管理 我使用的是clearcase UCM 正如 如何使用 ClearCase
  • 如何使用 JMeter 中的正则表达式提取器提取某些值?

    如果我有两个相同的标签和相同的属性 唯一的区别是值 我如何提取第二个
  • 网络聊天是否有“重置”按钮?

    开箱即用的网络聊天默认按钮集是 发送 按钮和 上传文件 按钮 网络聊天是否有可用的 重置 按钮 可以结束当前对话并为同一用户从头开始新对话 是否需要打开一些配置或样式选项才能直观地看到 重置 按钮 聊天 对话历史记录需要保持完整 它不应该清
  • 验证 python passlib 生成的密码哈希值

    我需要验证使用 python 生成的密码哈希值passlib 我的目标是使用 passlibpbkdf2 sha512对所有用户密码进行哈希处理的方案 但是 由于我们后端的性质 我需要从 php 脚本 js 和 java 验证此密码 我还没
  • 在 C 中调用 GNU Octave 函数?

    我想使用矩阵代数和优化 我已经测试了不同的矩阵代数 C 和 C 库 但这些库的问题是它们不能像 GNU Octave 那样处理垃圾数据 C 和 C 中的垃圾数据会降低到 e 8 但在 GNU Octave 中 它将降低到 e 17 如果您计