0

我正在尝试绘制两个向量,如果我已经mxArray从 MATLAB 存储了两个 s 的元素(使用 Visual C++ 编译器)。

test1并且test2mxArrayMAT 文件中的 s,当我打印它们时就可以了。但是当我运行程序时,这个数字是空白的。

#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);

}
4

1 回答 1

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)

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

3)std::memcpy()接收 void 指针;所以你的演员没有用

如果你真的想使用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];

ps:对不起我的英语不好

于 2016-05-10T14:09:31.167 回答