Jelajahi Sumber

Large sample program for MATIO and algebra operations

Clemens-A. Brust 11 tahun lalu
induk
melakukan
5aa4da5238
1 mengubah file dengan 79 tambahan dan 2 penghapusan
  1. 79 2
      core/tutorial/progs/05_matio.cpp

+ 79 - 2
core/tutorial/progs/05_matio.cpp

@@ -10,32 +10,109 @@
 
 #include <iostream>
 #include <string>
+#include <exception>
 #include <core/image/ImageT.h>
 #include <core/vector/MatrixT.h>
+#include <core/vector/VectorT.h>
+#include <core/vector/Eigen.h>
+#include <core/vector/SVD.h>
 #include <core/image/FilterT.h>
 
 #ifdef NICE_USELIB_MATIO
 #include <core/matlabAccess/MatFileIO.h>
 
+template<typename T> void printMatrix(NICE::MatrixT<T> matrix);
+
 /*
  * Entry point
  */
 int main(int argc, char** argv) {
 	// Check if enough parameters were supplied
-	if (argc < 2) {
-		std::cout << "USAGE: " << argv[0] << " <matlab file>\n";
+	if (argc < 3) {
+		std::cout << "USAGE: " << argv[0] << " <matlab file> <matrix name>\n";
 		return -1;
 	}
 
 	// These are our file names
 	std::string input_path(argv[1]);
+	std::string matrix_name(argv[2]);
 
 	NICE::MatFileIO matlab_file(input_path, MAT_ACC_RDONLY);
 	
+	// Show the number of variables in the file
 	int vars_in_file = matlab_file.getNumberOfVariables();
 	std::cout << vars_in_file << " Variables in " << input_path << "\n";
 
+	// Load the matrix
+	std::cout << "Loading matrix \"" << matrix_name << "\"...\n";
+
+	// Check if the variable is a matrix
+	matvar_t* matrix_variable = matlab_file.getVariableViaName(matrix_name);
+	if(matrix_variable->rank != 2) {
+		std::cout << "Variable is not a matrix. Rank: " << matrix_variable->rank << ".\n";
+		return -1;
+	}
+
+	// Read the dimensions
+	int cols = matrix_variable->dims[1];
+	int rows = matrix_variable->dims[0];
+	std::cout << "Dimensions: " << cols << " x " << rows << "\n";
+
+	// Read the matrix into a vector of vectors
+	std::vector< std::vector<double> > matrix_vecvec(rows, std::vector<double>(cols));
+	matlab_file.getFeatureMatrixViaName(matrix_vecvec, matrix_name);
+
+	// Now, we want a NICE matrix
+	NICE::MatrixT<double> matrix(rows, cols);
+	for(int i = 0; i < rows; i++) {
+		for(int j = 0; j < cols; j++) {
+			matrix(i,j) = matrix_vecvec[i][j];
+		}
+	}
+
+	// Print the NICE matrix
+	printMatrix(matrix);
+
+	// Check if eigenvalues exist
+	if(rows != cols) {
+		std::cout << "Matrix is not square, cannot calculate eigenvalues!\n";
+		return -1;
+	}
+
+	// Calculate eigenvalues
+	try {
+		NICE::VectorT<double>* matrix_eigenvalues = NICE::eigenvalues(matrix);
+	} catch (std::exception& e) {
+		std::cout << "Exception occured during eigenvalue calculation, "
+			<< "is IPP installed?\n";
+	}
+
+#ifdef NICE_USELIB_LINAL
+	// Calculate singular value decomposition
+	NICE::SVD matrix_svd(matrix);
+
+	std::cout << "Vt:\n";
+	printMatrix(matrix_svd.getVt());
+
+	std::cout << "U:\n";
+	printMatrix(matrix_svd.getU());
+
+	std::cout << "S:\n";
+	printMatrix(matrix_svd.getS());
+#else
+	std::cout << "LinAL is not installed, SVD calculation is not possible!\n";
+#endif
 	return 0;
+
+}
+
+template<typename T> void printMatrix(NICE::MatrixT<T> matrix) {
+	for(int i = 0; i < matrix.rows(); i++) {
+		for(int j = 0; j < matrix.cols(); j++) {
+			std::cout << matrix(i,j) << "\t";
+		}
+		std::cout << "\n";
+	}
 }
 #else