--- /dev/null
+#ifndef __CPEXTENSIONS__ALGORITHMS__KALMANFILTER__HXX__
+#define __CPEXTENSIONS__ALGORITHMS__KALMANFILTER__HXX__
+
+// -------------------------------------------------------------------------
+template< typename T >
+template< class M >
+void cpExtensions::Algorithms::KalmanFilter< T >::
+Kronecker( M& AkB, const M& A, const M& B )
+{
+ unsigned int m = A.rows( ); unsigned int n = A.cols( );
+ unsigned int p = B.rows( ); unsigned int q = B.cols( );
+ AkB.set_size( m * p, n * q );
+
+ for( unsigned int i = 1; i <= m; ++i )
+ {
+ for( unsigned int j = 1; j <= n; ++j )
+ {
+ for( unsigned int k = 1; k <= p; ++k )
+ {
+ for( unsigned int l = 1; l <= q; ++l )
+ {
+ unsigned int al = ( ( p * ( i - 1 ) ) + k ) - 1;
+ unsigned int be = ( ( q * ( j - 1 ) ) + l ) - 1;
+ AkB[ al ][ be ] = A[ i - 1 ][ j - 1 ] * B[ k - 1 ][ l - 1 ];
+
+ } // rof
+
+ } // rof
+
+ } // rof
+
+ } // rof
+}
+
+#endif // __CPEXTENSIONS__ALGORITHMS__KALMANFILTER__HXX__
+
+// eof - $RCSfile$