首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++编译器中使用Mxarray绘制两个向量

在C++编译器中使用Mxarray绘制两个向量
EN

Stack Overflow用户
提问于 2016-05-10 19:01:49
回答 1查看 141关注 0票数 0

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

test1test2是MAT-file中的mxArray,当我打印它们时,它是正常的。但是当我运行这个程序时,这个图形是空白的。

代码语言:javascript
复制
#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);

}
EN

回答 1

Stack Overflow用户

发布于 2016-05-10 22:09:31

使用下面的说明

代码语言:javascript
复制
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)内存复制v (和v1)的指针是内存复制结构向量,而不是结构向量中包含的数据。

3) std::memcpy()接收空指针;因此您的强制转换没有用处

如果你真想使用std::memcpy(),而且你使用的是C++11/C++14编译器,我想你可以写

代码语言:javascript
复制
memcpy(mxGetPr(T), v.data(), sizeof(double)*v.size());
memcpy(mxGetPr(D), v1.data(), sizeof(double)*v1.size());

不然的话,老好人

代码语言:javascript
复制
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];

附言:对不起,我的英语不好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37136631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档