首页 > 解决方案 > 使用数据接口将 C++ 数据存储到八度?

问题描述

Matlab 为 C/C++ 提供数据接口,请参见此处。这允许用户在运行时将数据从 C/C++ 导出为 Matlab 格式(*.mat 文件)。这意味着您可以从 C++ 程序中导出数据,然后使用 Matlab 返回数据进行分析。

我想开始使用开源替代品 Octave 来代替 Matlab。但是,我对 octave 提供的 C/C++ 接口感到困惑。到目前为止我所理解的是,我可以使用 Octave的外部代码接口调用外部例程。

但是我也可以反过来,在运行时将数据从我的 C++ 程序存储到八度吗?如果是,将高度赞赏指向最小示例的指针。

标签: c++matlaboctave

解决方案


这可能不是您的答案,但是将其写为评论太长且太密集,因此为了方便起见,我将其写为答案,并且希望在尝试澄清事情时无论如何它都可以为您提供答案。

从本质上讲,您的问题有些混乱。值得首先澄清这些观点。如果我在这里的评论没有回答您的问题,也许您可​​以根据我下面的评论编辑您的问题以明确您想要什么。

  1. Matlab 提供了两种接口,一种用于 C,一种用于 C++。这些是完全独立的接口。

  2. 这些是通用接口,用于用 C 语言编写函数,并从 matlab 调用该函数,反之亦然。它们不适用于“导出数据”。通过提供的api调用matlab“保存”函数,可以将C代码中的数据存储到.mat中,但我想不出一个很好的理由通过C而不是作为matlab的一部分来做到这一点脚本调用 C 编写的函数来处理一些数据,然后从 matlab 调用“保存”来保存结果。

  3. Octave 支持 matlab 的“C”接口(所谓的“.mex”文件)。它不支持 matlab 的“C++”接口。但它确实有自己的“C++”接口,即“.oct”文件。

  4. 如果您有一个执行您所要求的 .mex 文件的示例,那么大概它也可以在几乎没有修改的情况下以八度编译(除了包含正确的库名称以反映八度标头)。

  5. “我可以从 Octave 调用外部例程” <--您可以为通用 C++ 代码分配一个函数名并对其进行转换,以便您可以从 octave 调用它。更重要的是,您可以从 octave 传递此函数输入,让它处理 C++ 中的计算,然后将结果返回给 octave。这就是你的意思吗?如果是这样,那么是的,这是可能的,并且您链接的手册部分有如何执行此操作的示例(顺便说一句,请注意您正在链接到旧版本,最新版本的手册是 octave.org/doc/v5 .2.0)

  6. Octave 还提供了一个接口,用于直接从 C++ 代码调用Octave函数(无论是在打算在 octave 内使用的 .oct 文件的上下文中,还是在想要在内部使用 octave 函数的独立 C++ 可执行文件的上下文中)。

当您说“存储数据”时,在我看来,您基本上是在询问第 5 点,即将数据作为输入传递给 c++ 编写的函数,让 c++ 对这些数据进行处理,然后将其结果返回给八度工作区。那是对的吗?或者您在要求一种专门从 C++ 中创建 .mat 文件的方法吗?

如果您要求的只是前者,那么手册提供了许多示例。例如,如果您想尝试接近本页末尾的那个:https ://octave.org/doc/v5.2.0/Matrices-and-Arrays-in-Oct_002dFiles.html#Matrices-and-Arrays-in-Oct_002dFiles ,然后说代码保存在 file 中addtwomatrices.cpp,然后您可以像这样编译(例如从您的 linux 终端):

$ mkoctfile -c addtwomatrices.cpp
$ mkoctfile ./addtwomatrices.o -o ./addtwomatrices

然后像这样从八度音程调用它:

> addtwomatrices( eye(2), magic(2) )
ans =
   5   3
   1   3

更新

这是直接从 C++ 创建矩阵然后将其保存为八度兼容格式的示例。

// in testmat.cpp
# include <octave/oct.h>
# include <octave/ls-oct-text.h>   /* defines save_text_data */

int main ()
{
 // Create a matrix and fill it with values
    Matrix M(3,3);
    for (int i = 0;  i < 9;  ++i )   { M.elem(i) = i+1.; }

 // Save to disk
    std::ofstream out_file_stream( "out.mat" );
    save_text_data ( out_file_stream,
                     octave_value(M),
                     std::string("M_matrix"),   // variable name
                     true,                      // mark as global?
                     5                          // precision
                   );

    out_file_stream.close();
}

编译、链接和运行:

mkoctfile -c testmat.cpp
mkoctfile --link-stand-alone -o testmat testmat.o
LD_LIBRARY_PATH=/opt/octave-5.2.0/lib/octave/5.2.0 ./testmat   # change path accordingly

从 octave 确认 out.mat 已正确保存并且可以在 octave 中打开:

octave:1> load out.mat
octave:2> M_matrix
M_matrix =
   1   4   7
   2   5   8
   3   6   9

推荐阅读