【发布时间】:2015-10-22 14:33:03
【问题描述】:
我开发了一个 C++ 程序,它在一个循环中计算一组坐标 (x, y)。每次迭代我都想以大约每秒 25 次的速度将坐标发送到 Matlab 进行进一步处理。我有一个 Matlab 函数,它可以获取这个坐标并实时使用它;但是,我还没有找到一种将变量从 C++ 快速发送到 Matlab 的有效方法。
我在这里尝试过使用 Matlab 引擎:Passing Variable from C++ to Matlab (Workspace),但我希望在现有的 Matlab 会话中使用这个变量,而不是简单地通过 C++ 运行 Matlab 命令。
我还尝试将 C++ 坐标写入二进制文件,然后在 Matlab 中读取该文件 - 这种方法非常快,但我在两种语言之间的时间上遇到了问题。将 Matlab 代码设置为读取二进制文件的无限循环,同时运行 C++ 程序将坐标写入文件,这意味着 Matlab 以非常奇怪的顺序读取(即,当我编写i 值文件)。我怀疑这是由于每个程序尝试打开和读取或写入文件之间的时间差。
C++:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <iostream>
#include <math.h>
#include <fstream>
#include <stdio.h>
#include <Windows.h>
using namespace cv;
using namespace std;
int main()
{
int a = 0
for (int i = 0; i < 100000; ++i)
{
a = i;
std::ofstream ofile("foobar.bin", std::ios::binary);
ofile.write((char*) &a, sizeof(int));
ofile.close();
}
return 0;
}
Matlab:
A = fopen('foobar.bin');
fread(A)
fclose(A);
有没有办法通过写入二进制文件或我可以实现的其他方法在 C++ 和 Matlab 之间快速准确地发送数据?
非常感谢!
【问题讨论】:
-
您是否尝试过在 MEX 中通过标准方式?我无法想象写入磁盘会更快。我认为它实际上会更慢,因为它在内存缓冲区频谱中较低。
-
MEX是怎么通过的?是简单地从 Matlab 调用 C++ 函数,还是实际上将变量从 C++ 程序传递给 Matlab?
-
只看谷歌上的例子。这是one。您可以直接通过 MEX 接口将变量传入和传出 C++ 函数。
-
感谢您的示例!但是,我认为当我需要该值时,我不能简单地从 Matlab 调用 C++ 函数,因为该值是在 C++ 的无限循环中创建的,同时复杂的过程正在进行。理想情况下,在 C++ 的无限循环中,我想在开始下一次迭代之前将变量传递给 Matlab。
标签: c++ matlab binaryfiles file-writing