2016-05-10 5 views
0

私は2つのベクトルをプロットしようとしています。私はの2つの要素を(Visual C++コンパイラを使用して)保存していました。Mxarraysを持つ2つのベクトルをC++コンパイラにプロット

test1およびtest2は、MATファイルのmxArrayで、印刷すると問題ありません。しかし、私はプログラムを実行すると、数字は空白です。以下の手順

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

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

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

} 
+0

私の悪い英語のため申し訳ありませんが、あなたがMX 'としてMATファイルから負荷行列を望んでいたようですそれらをプロットします。 'std :: vector'との間の往復変換は必要ありません!単に 'matGetVariable'によって返された配列を使用してください。 – Amro

答えて

0

は、私はあなたの意図がmxGetPr(T)mxGetPr(D)vv1に含まれるデータにコピーしたとします。

しかし

1)std::vector<double>は、その中に(私は仮定)のポインタを持つクラスです。そうsizeof(v)sizeof(v1)はMEM)はv(及びv1のポインタをコピーMEMは、構造体のベクトルをコピーしている含まれるデータのサイズが、

2(私の打ち鳴らす++ 24)を固定サイズ)ではないが、データは含まれていませんその中に。

3)std::memcpy()受信voidポインタ。私はあなたが、そうでなければ良いの

memcpy(mxGetPr(T), v.data(), sizeof(double)*v.size()); 
memcpy(mxGetPr(D), v1.data(), sizeof(double)*v1.size()); 

を書くことができると仮定し、あなた本当にstd::memcpy()を使いたい、とあなたがC++ 11/C++ 14コンパイラを使用している場合ので、あなたのキャストは

役に立たないです古い

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:これは不必要に複雑である

+0

ありがとうございます。 :-) –

関連する問題