| 
									
										
										
										
											2010-02-14 15:25:03 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * tensorInterface.cpp | 
					
						
							|  |  |  |  * @brief Interfacing tensors template library and gtsam | 
					
						
							|  |  |  |  * Created on: Feb 12, 2010 | 
					
						
							|  |  |  |  * @author: Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/geometry/tensorInterface.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-14 15:25:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace tensors; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 07:45:53 +08:00
										 |  |  | boost::tuple<int, double, Vector> DLT(const Matrix& A) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Do SVD on A
 | 
					
						
							|  |  |  | 	Matrix U, V; | 
					
						
							|  |  |  | 	Vector S; | 
					
						
							|  |  |  | 	svd(A, U, S, V, false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Find minimum column
 | 
					
						
							|  |  |  | 	int n = V.size2(), min_j = n - 1, rank = 0; | 
					
						
							|  |  |  | 	for (int j = 0; j < n; j++) | 
					
						
							|  |  |  | 		if (S(j) > 1e-9) | 
					
						
							|  |  |  | 			rank++; | 
					
						
							|  |  |  | 	double min_S = S(min_j); | 
					
						
							|  |  |  | 	for (int j = 0; j < n - 1; j++) | 
					
						
							|  |  |  | 		if (S(j) < min_S) { | 
					
						
							|  |  |  | 			min_j = j; | 
					
						
							|  |  |  | 			min_S = S(j); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Return minimum column
 | 
					
						
							|  |  |  | 	return boost::tuple<int, double, Vector>(rank, min_S, column_(V, min_j)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-02-14 15:25:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | } // namespace gtsam
 |