如何在C++和MATLAB之间交换数据?

3

目前我正在开发一款基于MATLAB代码的C++程序。在开发期间,我需要将中间结果输出到MATLAB,以便将C++实现的结果与MATLAB结果进行比较。我现在所做的是用C++编写二进制文件,然后使用MATLAB加载该二进制文件。以下代码显示了一个示例:

int main ()
{
    ofstream abcdef;
    abcdef.open("C:/test.bin",ios::out | ios::trunc | ios::binary); 

    for (int i=0; i<10; i++)
    {
        float x_cord;
        x_cord = i*1.38;
        float y_cord;
        y_cord = i*10;
        abcdef<<x_cord<<"   "<<y_cord<<endl;
    }

    abcdef.close();

    return 0;
} 

当我有一个名为test.bin的文件时,我可以使用MATLAB命令自动加载该文件:
 data = load('test.bin');

当输出为数值数据时,该方法可行;然而,如果输出为具有许多成员变量的类,则可能失败。 我想知道是否有更好的方法来处理不仅仅是简单的数值数据,还包括复杂的数据结构。谢谢!


你的问题的答案取决于你将要导入到MATLAB中的数据结构的复杂性,因为有很多可能性:请参见推荐的导入数据方法。为了最大的灵活性,我建议从C++编写MAT文件,但这可能是过度的,因为它需要掌握MATLAB内部数据格式。 - Stefano M
你曾经考虑过使用套接字来进行数据的双向传输吗? - user1401864
2个回答

1
我建议使用MATLAB引擎,通过它你可以实时传递数据到MATLAB,并且可以利用MATLAB提供的各种图形绘制工具来可视化数据。
你只需要从C/C++程序中调用MATLAB引擎,然后就可以直接从C/C++程序执行MATLAB命令和/或在MATLAB和C/C++之间交换数据。它可以双向进行,即从C++到MATLAB和反过来都可以。
你可以查看一个工作示例,如此处所示。

0
我建议在matlab中使用fread命令。我经常用它来在matlab和其他程序之间交换数据,例如:
fd = fopen('datafile.bin','r');
a = fread(fd,3,'*uint32');
b = fread(fd,1,'float32');

使用 fread 可以灵活读取任何类型的数据。在名称中加入 *,如上所示,还可以表示你想将其存储为该数据类型,而不是默认的 matlab 数据类型。因此,第一个函数读取了 3 个 32 位 无符号整数并将它们存储为整数。第二个函数读取了单精度浮点数,但将其存储为默认的双精度。

你需要控制数据在 c++ 代码中的写入方式,但这是必然的。你可以在 c++ 中创建一个类方法来以确定性的方式打包数据。

Dustin


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接