我试图绘制两个向量,因为我已经存储了来自MATLAB的两个mxArray的元素(使用Visual C++编译器)。
test1和test2是MAT-file中的mxArray,当我打印它们时,它是正常的。但是当我运行这个程序时,这个图形是空白的。
#include "mat.h"
#include "NoneDynamic.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <engine.h>
using namespace std;
mxArray *T = NULL, *D = NULL;
Engine *ep;
void matread(const char *file, std::vector<double>& v)
{
// open MAT-file
MATFile *pmat = matOpen("DataTesting.mat", "r");
if (pmat == NULL) return;
// extract the specified variable
mxArray *arr = matGetVariable(pmat, file);
if (arr != NULL && mxIsDouble(arr) && !mxIsEmpty(arr)) {
// copy data
mwSize num = mxGetNumberOfElements(arr);
double *pr = mxGetPr(arr);
if (pr != NULL) {
v.resize(num);
v.assign(pr, pr + num);
}
}
// cleanup
mxDestroyArray(arr);
matClose(pmat);
}
int main()
{
SeenData object;
vector<double> v;
matread("Test1", v);
vector <double> v1;
matread("test2", v1);
if (!(ep = engOpen(""))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
T = mxCreateDoubleMatrix(1,100, mxREAL);
memcpy((vector<double> *)mxGetPr(T), (vector<double>*) &v, sizeof(v));
D = mxCreateDoubleMatrix(1,100, mxREAL);
memcpy((vector<double> * )mxGetPr(D), (vector<double>*) &v1, sizeof(v1));
engPutVariable(ep, "T", T);
engPutVariable(ep, "D", D);
engEvalString(ep, "plot (T,D)");
fgetc(stdin);// for pausing long enough to see the plot
engEvalString(ep, "close;");
mxDestroyArray(T);
mxDestroyArray(D);
engClose(ep);
}发布于 2016-05-10 22:09:31
使用下面的说明
memcpy((vector<double> *)mxGetPr(T), (vector<double>*) &v, sizeof(v));
memcpy((vector<double> * )mxGetPr(D), (vector<double>*) &v1, sizeof(v1));我猜您的意图是在mxGetPr(T)和mxGetPr(D)中复制v和v1中包含的数据。
但
1) std::vector<double>是一个(我认为)带有指针的类;所以sizeof(v)和sizeof(v1)不是包含的数据的大小,而是一个固定的大小(对于我的clang++是24)
2)内存复制v (和v1)的指针是内存复制结构向量,而不是结构向量中包含的数据。
3) std::memcpy()接收空指针;因此您的强制转换没有用处
如果你真想使用std::memcpy(),而且你使用的是C++11/C++14编译器,我想你可以写
memcpy(mxGetPr(T), v.data(), sizeof(double)*v.size());
memcpy(mxGetPr(D), v1.data(), sizeof(double)*v1.size());不然的话,老好人
double * tp = mxGetPr(T);
for ( std::size_t ui = 0 ; ui < v.size() ; ++ui )
tp[ui] = v[ui];
double * td = mxGetPr(D);
for ( std::size_t ui = 0 ; ui < v1.size() ; ++ui )
td[ui] = v1[ui];附言:对不起,我的英语不好
https://stackoverflow.com/questions/37136631
复制相似问题