Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何比较C和x2B之间的结果+;还有MATLAB?_C++_Matlab_Diagnostics - Fatal编程技术网

C++ 如何比较C和x2B之间的结果+;还有MATLAB?

C++ 如何比较C和x2B之间的结果+;还有MATLAB?,c++,matlab,diagnostics,C++,Matlab,Diagnostics,我有一个程序,可以分几个阶段处理二维双精度阵列。我想将它的结果与MATLAB进行比较。我可能可以使用std::cout在处理前后(算法在块上工作)将一些8x8大小的块打印到控制台上,然后手动将这些数字输入MATLAB。但这是容易出错的,泰迪乌斯。有没有一种方法可以方便地将这些数据输入MATLAB Matlab内置函数来简化许多事情。我想在C++程序中处理之前和之后得到的数据到Matlab中,然后运行它的一些检查。如何从C++程序中得到C++的数据?< p>从C++程序到MATLAB的数值数据是非

我有一个程序,可以分几个阶段处理二维双精度阵列。我想将它的结果与MATLAB进行比较。我可能可以使用std::cout在处理前后(算法在块上工作)将一些8x8大小的块打印到控制台上,然后手动将这些数字输入MATLAB。但这是容易出错的,泰迪乌斯。有没有一种方法可以方便地将这些数据输入MATLAB


Matlab内置函数来简化许多事情。我想在C++程序中处理之前和之后得到的数据到Matlab中,然后运行它的一些检查。如何从C++程序中得到C++的数据?

< p>从C++程序到MATLAB的数值数据是非常容易的。只需将数字作为ascii文本输出到文件中,然后使用
load
将列中的每个数字用空格分隔,每行用换行符分隔即可

让我们以3行2个数字为例,假设您创建了一个文件“text.txt”,如下所示:

1 2
3 4
5 6
然后,在Matlab中,命令:

 load text.txt

将数据读入一个名为
text
的变量,该变量是一个3x2矩阵。

此外,您可以进行一些漂亮的输出,并直接写入一个可运行的
.m
文件(我使用这种方法将数字输入LaTeX文档)。这种方法的一个好处是,您可以用一个文件定义多个MATLAB变量。例如:

#include <fstream>

int main() {
  std::ofstream file;
  file.open ("cpp_output.m");
  file << "out = [\n";
  for (double x = 1; x<6; x++) {
    file << x << ' ' << 1/(x*x) << '\n';
  }
  file << "];";
  file.close();
}

您可能想要更改精度(例如)

您是否考虑过使用mex函数?如果你使用它们,我强烈推荐使用库,它提供了方便的数据类型和方法来在Matlab和C++之间切换。 比如说,

#include "mex.h"
#include <armadillo>
#include "armaMex.hpp"
#include <sstream>    

// gateway function
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{     
// get data from MATLAB
mat X = conv_to<mat>::from(armaGetPr(prhs[0],true));
mat Y = conv_to<mat>::from(armaGetPr(prhs[1],true));

// do some stuff
mat Z = X + Y;

// Print data in matlab
std::ostringstream buffer;
buffer << "X = " << X << endl;
buffer << "Y = " << Y << endl;
buffer << "Z = " << Z << endl;
mexPrintf("%s", buffer.str().c_str());    

// send data back to Matlab
plhs[0] = armaCreateMxMatrix(Z.n_rows, Z.n_cols, mxDOUBLE_CLASS, mxREAL); 
armaSetPr(plhs[0], conv_to<mat>::from(Z));

return;
}
#包括“mex.h”
#包括
#包括“armaMex.hpp”
#包括
//网关功能
void MEX函数(int nlhs、mxArray*plhs[]、int nrhs、const mxArray*prhs[])
{     
//从MATLAB中获取数据
mat X=conv_to::from(armaGetPr(prhs[0],true));
mat Y=conv_to::from(armaGetPr(prhs[1],true));
//做点什么
matz=X+Y;
//在matlab中打印数据
std::ostringstream缓冲区;

缓冲区只是将C++程序的输出重定向到文本文件,然后是文本文件而不是二进制文件。OKI,我可以导入数据,然后在3D数组中分割成块。这很好。在我的理解中,MATLAB只能输入一个m文件,我不知道如何以C++文本格式创建,除非你有一个巨大的文件,否则一般是最好的。数据量太大,以至于文件大小成了一个问题-文本文件更容易处理,也更便于携带。@史蒂夫:一般来说,读取/写入二进制浮点值是可行的,但在某些情况下可能会出现兼容性问题,例如8/10字节的双精度,甚至是尾数。文本更容易处理,因为它是人类可读的,可以用许多不同的工具来读写,例如电子表格、数据库等等。我认为MATLAB只与.m文件和其他一些有限的非C++友好格式一起工作。但是现在很明显,情况并非如此。
#include "mex.h"
#include <armadillo>
#include "armaMex.hpp"
#include <sstream>    

// gateway function
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{     
// get data from MATLAB
mat X = conv_to<mat>::from(armaGetPr(prhs[0],true));
mat Y = conv_to<mat>::from(armaGetPr(prhs[1],true));

// do some stuff
mat Z = X + Y;

// Print data in matlab
std::ostringstream buffer;
buffer << "X = " << X << endl;
buffer << "Y = " << Y << endl;
buffer << "Z = " << Z << endl;
mexPrintf("%s", buffer.str().c_str());    

// send data back to Matlab
plhs[0] = armaCreateMxMatrix(Z.n_rows, Z.n_cols, mxDOUBLE_CLASS, mxREAL); 
armaSetPr(plhs[0], conv_to<mat>::from(Z));

return;
}