瀏覽代碼

fix error for package matio

bodesheim 12 年之前
父節點
當前提交
27f0ea62a2
共有 3 個文件被更改,包括 32 次插入16 次删除
  1. 15 8
      core/matlabAccess/MatFileIO.cpp
  2. 1 0
      core/matlabAccess/MatFileIO.h
  3. 16 8
      core/matlabAccess/progs/testMatFileIO.cpp

+ 15 - 8
core/matlabAccess/MatFileIO.cpp

@@ -62,17 +62,14 @@ namespace NICE {
       
       matvar_t * MatFileIO::getVariableViaName(std::string _name) {
       
-// 	std::cout << "MatFileIO::getVariableViaName: method entered" << std::endl;
-	char * cString = new char[256];
-// 	std::cout << "MatFileIO::getVariableViaName: cString init done" << std::endl;
-	return Mat_VarRead(mat,strcpy(cString,_name.c_str()));
+        return Mat_VarRead(mat,_name.c_str());
 	
       }
       
       void MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name) {
 	
 	matvar_t * matvar = getVariableViaName(_name);
-	
+
 	if (matvar == NULL) {
 	  
 	  fthrow(Exception, "MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name): variable with specified name does not exist");
@@ -81,12 +78,17 @@ namespace NICE {
 
 	if (matvar->class_type != MAT_C_SPARSE) {
 	  
+          Mat_VarFree(matvar);
 	  fthrow(Exception, "MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name): format of variable is not sparse");
 	  return;
 	}
 	
-	sparseVariable = *((sparse_t*)matvar->data);
-	sparseVariable.data = (double*) sparseVariable.data;
+	sparse_t * sparse_ptr = (sparse_t*) matvar->data;
+	sparse_ptr->data = (double*) sparse_ptr->data;
+        sparseVariable = *sparse_ptr;
+        matvar->data = NULL;
+        Mat_VarFree(matvar);
+        free(sparse_ptr);
       }
 
       
@@ -102,6 +104,7 @@ namespace NICE {
 	
 	if (matvar->rank != 2) {
 	  
+          Mat_VarFree(matvar);
 	  fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): dimension of variable != 2");
 	  return;
 	}
@@ -411,10 +414,12 @@ namespace NICE {
           
 	} else {
 	  
+          Mat_VarFree(matvar);
 	  fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): wrong feature_matrix_order specified");
 	  return;
 	}	
 	
+	Mat_VarFree(matvar);
       }
       
       void MatFileIO::getVectorViaName(NICE::Vector & vec, std::string _name) {
@@ -430,6 +435,7 @@ namespace NICE {
 	// it can happen that a vector is treated as (N x 1) or (1 x N) matrix with two dimensions
 	if (matvar->rank > 2 || ( (matvar->rank == 2) && (matvar->dims[0] != 1) && (matvar->dims[1] != 1) ) ) {
 	  
+          Mat_VarFree(matvar);
 	  fthrow(Exception, "MatFileIO::getVectorViaName(NICE::Vector & vec, std::string _name): dimension of variable > 1");
 	  return;
 	}  
@@ -655,7 +661,8 @@ namespace NICE {
 	  
 	}
 	
-	vec = NICE::Vector(v);	
+	vec = NICE::Vector(v);
+        Mat_VarFree(matvar);
       }
 }
 

+ 1 - 0
core/matlabAccess/MatFileIO.h

@@ -25,6 +25,7 @@
 #else //#ifdef NICE_USELIB_MATIO
 
 #include <matio/matio.h>
+#include <matio/matio_private.h>
 
 #ifndef sparse_t
 #define sparse_t mat_sparse_t

+ 16 - 8
core/matlabAccess/progs/testMatFileIO.cpp

@@ -25,13 +25,21 @@ int main (int argc, char* argv[])
 #ifdef NICE_USELIB_MATIO	
   std::string filenameA = "/home/bodesheim/data/2012-01-09-testMatFileIO/sparse3x3matrixA.mat";
 
+#if defined(MAT73) && MAT73
+  printf("\nMAT73 defined \n");
+#endif  
+  
   // A
   MatFileIO matfileIOA = MatFileIO(filenameA,MAT_ACC_RDONLY);
   printf("\n%d \n", matfileIOA.getNumberOfVariables());
   
   sparse_t sparseA;
   matfileIOA.getSparseVariableViaName(sparseA,"A");
-  for (uint i = 0; i < sparseA.nzmax; i++) std::cout << ((double*)sparseA.data)[i]<< "  "; 
+  printf("\nget done\n");
+  printf("\n%d\n", (int) sparseA.nzmax);
+  printf("\n%d\n", (int) sparseA.ndata);
+  
+  for (uint i = 0; i < (int) sparseA.nzmax; i++) std::cout << ((double*)sparseA.data)[i]<< "  "; 
   std::cerr << std::endl;
   std::cerr << "now start reading imagenet-data" << std::endl;
   
@@ -71,27 +79,27 @@ int main (int argc, char* argv[])
   MatFileIO matfileIO = MatFileIO(filename,MAT_ACC_RDONLY);
   printf("\nnumber of variables: %d \n", matfileIO.getNumberOfVariables()); 
   
-  sparse_t *sparse;
-  matfileIO.getSparseVariableViaName(*sparse,variable1);
+  sparse_t sparse;
+  matfileIO.getSparseVariableViaName(sparse,variable1);
   
   printf("\nSparse Matrix \n"); 
 
   for ( int i = 0; i < 5; i++ ) {
-    for ( int j = sparse->jc[i]; j < sparse->jc[i+1] && j < sparse->ndata && j < sparse->jc[i]+5; j++ ) {
+    for ( int j = sparse.jc[i]; j < sparse.jc[i+1] && j < sparse.ndata && j < sparse.jc[i]+5; j++ ) {
                               
-	printf("\t\t(%d,%d)\t%f", sparse->ir[j]+1,i+1,((double*)sparse->data)[j]);
+	printf("\t\t(%d,%d)\t%f", sparse.ir[j]+1,i+1,((double*)sparse.data)[j]);
     }
     printf("\n");
   }
   
 //   int count = 0;
 //   
-//   for ( int i = 0; i < sparse->njc-1; i++ ) {
-//     for ( int j = sparse->jc[i]; j < sparse->jc[i+1] && j < sparse->ndata; j++ )
+//   for ( int i = 0; i < sparse.njc-1; i++ ) {
+//     for ( int j = sparse.jc[i]; j < sparse.jc[i+1] && j < sparse.ndata; j++ )
 //                          
 //       if (count < 15) {
 //       
-// 	printf("    (%d,%d)  %f\n", sparse->ir[j]+1,i+1, data[j]);
+// 	printf("    (%d,%d)  %f\n", sparse.ir[j]+1,i+1, data[j]);
 // 	count++;
 //       }     
 //   }