Я новичок в c ++ и пытаюсь импортировать файл mat в свою программу на c ++. Существует отдельный класс для получения всех свойств матрицы в файле mat. Ниже приведен мой заголовочный файл readmat.h
#ifndef READMAT_H
#define READMAT_H
#include "mat.h"#include "matrix.h"#include "mex.h"class readmat
{
private:
const size_t *dimarray;
const char **dir;
MATFile *pmat;
int ndir;
mxArray *pa;
const char *file;
int minute;
int second;
const char *name;
double *pointer;
bool isdouble;
void getmxpointer();
public:
//with default value
readmat(const char *f);
// get number of dimensions
int getnumbrofdimensions();
// get pointer to array
double* getarraypointer();
// get pointer to each dimension size
const size_t* dimensionpointer();
//number of elements
int numberofelements();};
#endif
Это мой readmat.cpp.
#include "readmat.h"#include <iostream>
#include "mat.h"#include "matrix.h"#include "mex.h"using namespace std;
// set the file name
readmat::readmat(const char *f)
{
file = f;
}
void readmat::getmxpointer()
{
pmat = matOpen(file, "r");
if (pmat == NULL) {
cout << "Error opening file" << endl;
}
else
{
dir = (const char **)matGetDir(pmat, &ndir);
if (dir == NULL) {
printf("Error reading directory of file %s\n", file);
}
else if (ndir>1)
{
cout << "The number of variables are larger than 1" << endl;
}
else
{
mxFree(dir);
matClose(pmat);
pmat = matOpen(file, "r");
for (int q = 0; q < 1; q++)
{
pa = matGetNextVariableInfo(pmat, &name);
}
matClose(pmat);
}
}}
int readmat::getnumbrofdimensions()
{
getmxpointer();
return mxGetNumberOfDimensions(pa);
}
double * readmat::getarraypointer()
{
getmxpointer();
pointer = mxGetPr(pa);
return pointer;
}
const size_t* readmat::dimensionpointer()
{
getmxpointer();
dimarray = mxGetDimensions(pa);
return dimarray;
}
int readmat::numberofelements()
{
getmxpointer();
return mxGetNumberOfElements(pa);
}
Следующее — мой main.cpp
#include "mat.h"#include <iostream>
#include <stdio.h>
#include <string.h> /* For strcmp() */
#include <stdlib.h> /* For EXIT_FAILURE, EXIT_SUCCESS */
#include <vector> /* For STL */
#include "readmat.h"
using namespace std;
int main()
{
int i;
int m;
int elements;
int numberofdimension;
double *datapoint;
const char *file = "pqfile.mat";
const size_t* dimepointer;
readmat thismat(file);
numberofdimension = thismat.getnumbrofdimensions();
dimepointer = thismat.dimensionpointer();
cout << "The dimensions are ";
for (m = 0; m < numberofdimension; m++)
{
cout << *(dimepointer + m);
cout << " ";
}
cout << endl;
cout << "This is the number of dimensions ";
cout << numberofdimension << endl;
datapoint = thismat.getarraypointer();
elements = thismat.numberofelements();
cout << "The array elements ";
cout << elements;
cout << endl;
cout << thismat.pointer;
/*for (n = 0; n < elements; n++)
{
cout << *(arraypint + m);
cout << " ";
}*/
cin >> i;
return 0;
}
Но здесь кроме getarraypointer () другие функции работают нормально. getarraypointer () возвращает нулевое значение, и в окне просмотра указатель datapoint, которому назначен возврат из getarraypointer (), не может прочитать сообщение памяти. Когда я запускаю тот же сегмент кода в основном, он работает без проблем. Вот этот код.
MATFile *pmat;
int i;
int ndir;
const char **dir;
const char *file = "pqfile.mat";
mxArray *pa;
const char *name;
double *in1pr;pmat = matOpen(file, "r");
if (pmat == NULL) {
printf("Error reopening file %s\n", file);
return(1);
}
//dir = (const char **)matGetDir(pmat, &ndir);
for (i = 0; i<1; i++) {
pa = matGetNextVariable(pmat, &name);
}
matClose(pmat);
in1pr = mxGetPr(pa);
cout << "Value of variable: ";
cout << *(in1pr + 5) << endl;
cin >> i;
return 0;
Задача ещё не решена.
Других решений пока нет …