我用 C/C++ 创建了一个模拟器,它应该以 .mat 文件的形式输出结果,该文件可以导入到 Matlab 中的一些可视化工具中。
在模拟过程中,结果存储在数据缓冲区中。缓冲区为 a std::map<const char *, double *>
,其中字符串应与对应的 matlab struct 字段同名,double* 为缓冲数据。
在模拟结束时,我使用以下代码将缓冲数据写入 .mat 文件
const char **fieldnames; // Declared and populated in another class method
int numFields; // Declared in another method. Equal to fieldnames length.
int buffer_size; // Declared in another method. Equal to number of timesteps in simulation.
std::map<const char *, double *> field_data;
std::map<const char *, mxArray *> field_matrices;
// Open .mat file
MATFile *pmat = matOpen(filename.str().c_str(), "w");
// Create an empty Matlab struct of the right size
mxArray *SimData_struct = mxCreateStructMatrix(1,1,this->numFields,this->fieldnames);
int rows=this->buffer_size, cols=1;
for(int i=0; i<this->numFields; i++) {
// Create an empty matlab array for each struct field
field_matrices[this->fieldnames[i]] = mxCreateDoubleMatrix(rows, cols, mxREAL);
// Copy data from buffers to struct fields
memcpy(mxGetPr(field_matrices[this->fieldnames[i]]), this->field_data[this->fieldnames[i]], rows * cols * sizeof(double));
// Insert arrays into the struct
mxSetField(SimData_struct,0,this->fieldnames[i],field_matrices[this->fieldnames[i]]);
}
matPutVariable(pmat, object_name.str().c_str(), SimData_struct);
我可以编译并启动模拟,但是当到达 matPutVariable 命令时它会因错误而死。我得到的错误是terminate called after throwing an instance of 'matrix::serialize::WrongSize'
. 我试图用谷歌搜索更多信息,但找不到可以帮助我的东西。
Mathworks 支持帮助我确定了问题的原因。我的应用程序使用 boost 1.55,但 Matlab 使用 1.49。通过添加额外的外部依赖项目录路径解决了这些依赖项之间的冲突。
-Wl,-rpath={matlab path}/bin/glnxa64