Problem with large arrays (c++ & variable editor) in R2012a win64

1 次查看(过去 30 天)
I've experienced problem when working with large array that is included in a cell array, ( z{1,1}(1,1) is the first element). The cell array z contains only the array, array dimensions are 2 times 18622656. I can access the array from .m scripts and functions without any problems, but
1) I can open cell array z in variable explorer and I can see that there is 2x18622656 double array in z{1,1}, but any attempt to open the array in will makes Matlab not responding ...
2) I can't access the array in C++ (VS2008), below is the source code
int main (int argc, char *argv[]) {
// get a name of a file
if (argc != 2) {
cout << "wrong parameters";
return(RETURN_ERROR);
}
string file = argv[1];
// open a matlab file7
MATFile *pmat = matOpen(file.c_str(), "r");
if (pmat == NULL) {
cout << "Error opening file " << file << endl;
return(RETURN_ERROR);
}
else cout << "Opening " << file << " ..." << endl;
// go through the content
int ndir;
const char **dir;
dir = (const char **)matGetDir(pmat, &ndir);
if (dir == NULL) {
cout << "Error reading directory of file " << file << endl;
return(RETURN_ERROR);
}
else {
cout << endl << "Directory of " << file << endl;
for (int i=0; i < ndir; i++) cout << dir[i] << endl;
}
cout << endl;
// more about z
mxArray *z = matGetVariableInfo(pmat, "z");
const mwSize *dims = mxGetDimensions(z);
cout << "z is " << mxGetClassName(z) << " with dimensions ";
for (mwSize c = 0; c < mxGetNumberOfDimensions(z); c++) cout << ((c == 0)? "":" x ") << dims[c];
cout << endl << "total number of elements : " << mxGetNumberOfElements(z) << endl;
// go for elements
for (mwIndex index = 0; index < mxGetNumberOfElements(z); index++) {
const mxArray *cell = mxGetCell(z, index);
if (cell != NULL) {
cout << " element " << index + 1 << " : " << mxGetClassName(cell);
const mwSize *cell_dims = mxGetDimensions(cell);
for (mwSize c = 0; c < mxGetNumberOfDimensions(cell); c++) cout << ((c == 0)? " ":" x ") << cell_dims[c];
cout << endl << "mxIsStruct :" << mxIsStruct(cell);
cout << endl << "mxIsDouble :" << mxIsDouble(cell);
cout << endl << "mxIsComplex :" << mxIsComplex(cell);
cout << endl << "mxIsCell :" << mxIsCell(cell);
cout << endl << "rows :" << mxGetM(cell);
cout << endl << "columns :" << mxGetN(cell);
double *data = (double *) mxGetData(cell);
// get an item
int x = 2;
int y = 73456;
mwIndex *xy_index = (mwIndex *)mxCalloc(2, sizeof(mwSize));
xy_index[0] = x;
xy_index[1] = y;
mwIndex index = mxCalcSingleSubscript(cell, mxGetNumberOfDimensions(cell), xy_index);
mxFree(xy_index);
if (data == NULL) cout << endl << "can't get data" << endl;
else cout << endl << " [" << x << ", " << y << "] = " ;
// destroy xy_index
mxFree(xy_index);
}
}
mxDestroyArray(z);
mxFree(dir);
// close file
if (matClose(pmat) != 0) {
cout << "Error closing file " << file << endl;
return(RETURN_ERROR);
}
cout << endl << "=== DONE ===" << endl;
return(RETURN_OK);
}
The code is compiled and linked without any problems, the output is following:
Opening test.mat ...
Directory of test.mat
z
r
path
file_in
cfg
c
z is cell with dimensions 1 x 1
total number of elements : 1
element 1 : double 2 x 18622656
mxIsStruct :0
mxIsDouble :1
mxIsComplex :0
mxIsCell :0
rows :2
columns :18622656
can't get data
I've tested mxGetPr as well, but the result is the same : NULL
Does anybody know how to access the data saved within such a structure in C++?

采纳的回答

Friedrich
Friedrich 2012-10-1
编辑:Friedrich 2012-10-1
Hi,
this is expected behavior. matGetVariableInfo loads the Array header information only, so the actual data is not loaded. Try to use matGetVariable to actually load the data and then use mxGetPr.
Why would one like to open 2x18622656 values (approx. 37million numbers) in MATLAB interactively? This seems pretty strange. I guess due all the graphic in ML is JAVA, opening this will fill up all the JAVA Heap space which finally leads to a crash.
  3 个评论
Friedrich
Friedrich 2012-10-2
编辑:Friedrich 2012-10-2
Hi,
try replacing matGetVariableInfo with matGetVariable in your code and you should be free to go.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Whos 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by