2016-05-10 4 views
0

Ich versuche, zwei Vektoren zu plotten, wo ich die Elemente von zwei mxArray s von MATLAB (mit Visual C++ Compiler) gespeichert habe.Plot zwei Vektoren mit Mxarrays in C++ Compiler

test1 und test2 sind die mxArray s aus der MAT-Datei, und wenn ich sie drucke, ist es in Ordnung. Aber wenn ich das Programm starte, ist die Figur leer.

#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

dies unnötig kompliziert ist, es scheint, dass Sie die Last-Matrizen aus einer MAT-Datei als 'mx wollten Array' und plotten sie. Die gesamte Round-Trip-Konvertierung von/nach 'std :: vector' wird nicht benötigt! Verwenden Sie einfach direkt das von 'matGetVariable' zurückgegebene Array – Amro

Antwort

0

Mit den folgenden Anweisungen

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

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

Ich nehme Ihre Absicht Kopie war in mxGetPr(T) und mxGetPr(D) die enthaltenen Daten in v und v1.

Aber

1) std::vector<double> ist eine Klasse mit (nehme ich an) einen Zeiger darin; so sizeof(v) und sizeof(v1) ist nicht die Größe der enthaltenen Daten, sondern eine feste Größe (24 für meine Klappern ++)

2) mem den Zeiger von v Kopieren (und v1) kopiert mem das struct Vektor, nicht die Daten enthalten drin.

3) std::memcpy() Void-Zeiger empfangen; so Ihre Besetzung ist unuseful

Wenn Sie wirklichstd::memcpy() verwenden möchten, und Sie werden mit einem C++ 11/C++ 14-Compiler, nehme ich an Sie

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

sonst, die gut schreiben

alt
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: sorry für mein schlechtes Englisch

+0

Vielen Dank. :-) –