将带有Mxarrays的两个向量绘制到C ++编译器中

时间:2016-05-10 11:01:49

标签: c++ matlab mex matlab-engine

我试图绘制两个向量,我已经从MATLAB中存储了两个mxArray的元素(使用Visual C ++编译器)。

test1test2是来自MAT文件的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);

}

1 个答案:

答案 0 :(得分:0)

按照以下说明

memcpy((vector<double> *)mxGetPr(T), (vector<double>*) &v, sizeof(v));

memcpy((vector<double> * )mxGetPr(D), (vector<double>*) &v1, sizeof(v1));

我认为您的意图是在mxGetPr(T)mxGetPr(D)中复制vv1中包含的数据。

但是

1)std::vector<double>是一个类(我猜)中有一个指针;所以sizeof(v)sizeof(v1)不是所包含数据的大小,而是固定大小(我的clang ++为24)

2)mem复制v(和v1)的指针是mem复制结构向量,而不是包含在其中的数据。

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];

p.s:抱歉我的英语不好