00001 #ifndef __VMML__QR_DECOMPOSITION__HPP__
00002 #define __VMML__QR_DECOMPOSITION__HPP__
00003
00004 #include <vmmlib/matrix.hpp>
00005 #include <vmmlib/vector.hpp>
00006 #include <vmmlib/exception.hpp>
00007
00008 #include <cmath>
00009 #include <vector>
00010
00011
00012
00013
00014
00015
00016
00017
00018 namespace vmml
00019 {
00020
00021 template< size_t M, size_t N, typename float_t >
00022 void qr_decompose_gram_schmidt(
00023 const matrix< M, N, float_t >& A_,
00024 matrix< M, M, float_t >& Q,
00025 matrix< N, N, float_t >& R
00026 )
00027 {
00028 Q = 0.0;
00029 R = 0.0;
00030
00031
00032 matrix< M, N, float_t > A( A_ );
00033
00034 vector< M, float_t > a_column;
00035 vector< M, float_t > q_column;
00036
00037
00038 for( size_t k = 0; k < N; ++k )
00039 {
00040
00041 A.getColumn( k, a_column );
00042 R.at( k, k ) = a_column.norm();
00043
00044 if ( R.at( k, k ) == 0.0 )
00045 break;
00046
00047
00048 Q.setColumn( k, a_column / R.at( k, k ) );
00049
00050 for( size_t j = k+1; j < N; ++j )
00051 {
00052 Q.getColumn( k, q_column );
00053 A.getColumn( j, a_column );
00054
00055 R.at( k, j ) = a_column.dot( q_column );
00056
00057 for( size_t i = 0; i < M; ++i )
00058 {
00059 A.at( i, j ) = A.at( i, j ) - R.at( k, j ) * Q.at( i, k );
00060 }
00061 }
00062 }
00063
00064 }
00065
00066
00067 }
00068
00069 #endif
00070