/************************************************************************/
/* */
/* Copyright 2004-2005 by Hirotaka Niitsuma */
/* */
/* */
/* This file is part of the STLLCV computer vision library. */
/* ( Version 0.1, Sep 28 2005 ) */
/* You may use, modify, and distribute this software according */
/* to the terms stated in the LICENSE file included in */
/* the STLLCV distribution. */
/* */
/* The STLLCV Website is */
/* http://www2s.biglobe.ne.jp/~niitsuma/STLLCV/ */
/* Please direct questions, bug reports, and contributions to */
/* niitsuma@mub.biglobe.ne.jp�@�@�@ */
/* */
/* THIS SOFTWARE IS PROVIDED AS IS AND WITHOUT ANY EXPRESS OR */
/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */
/* */
/************************************************************************/
#include <boost/numeric/ublas/symmetric.hpp>
#include "stllcv/ublascvmatrix.hxx"
#include "stllcv/matrixoperation.hxx"
#include "cv.h"
#include <fstream>
using namespace stllcv;
int main(int argc, char * argv[])
{
/*
using namespace boost::numeric::ublas;
symmetric_matrix<double, lower> ml (3, 3);
for (unsigned i = 0; i < ml.size1 (); ++ i)
for (unsigned j = 0; j <= i; ++ j)
ml (i, j) = 3 * i + j;
std::cout << ml << std::endl;
symmetric_matrix<double, upper> mu (3, 3);
for (unsigned i = 0; i < mu.size1 (); ++ i)
for (unsigned j = i; j < mu.size2 (); ++ j)
mu (i, j) = 3 * i + j;
std::cout << mu << std::endl;
*/
//init matrix
CublasCvMatrix<float,3,3> A;
A(0,0)=3; A(0,1)=2; A(0,2)=1;
A(1,0)=1; A(1,1)=1; A(1,2)=4;
A(2,0)=3; A(2,1)=2; A(2,2)=5;
CublasCvMatrix<float,3,3> B;
//Multiple as OpenCV �es matrix
cvMatMul( &(CvMat)A , &(CvMat)A, &(CvMat) B );
std::cout << "B=" << B << std::endl;
//Mutiple as uBLAS �es matrix
B =boost::numeric::ublas::prod (A,A);
std::cout << "B=" << B << std::endl;
CublasCvMatrix<float,4,3> AA;
AA(0,0)=3; AA(0,1)=2; AA(0,2)=1;
AA(1,0)=1; AA(1,1)=1; AA(1,2)=4;
AA(2,0)=3; AA(2,1)=2; AA(2,2)=5;
AA(3,0)=3; AA(3,1)=2; AA(3,2)=5;
CCovariance<float, boost::numeric::ublas::matrix<float> , boost::numeric::ublas::vector<float> > cov(AA);
//CCovariance cov(A);
std::cout << " AA=" << AA << std::endl;
std::cout << "cov AA=" << cov.covariance << std::endl;
std::cout << "ave AA=" << cov.average << std::endl;
//init vector
CublasCvVector<float,3> V;
V[0]=1 ; V[1]=2 ; V[2]=4;
CublasCvVector<float,3> U;
//Multiple as OpenCV matrix
cvMatMul( &(CvMat)A , &(CvMat)V, &(CvMat) U );
std::cout << "U=" << U << std::endl;
//Mutiple as uBLAS matrix
U =boost::numeric::ublas::prod (A,V);
std::cout << "U=" << U << std::endl;
boost::numeric::ublas::c_matrix<float,3,3> X;
X(0,0)=3; X(0,1)=2; X(0,2)=1;
X(1,0)=1; X(1,1)=1; X(1,2)=4;
X(2,0)=3; X(2,1)=2; X(2,2)=5;
std::cout << "X=" << X << std::endl;
CublasCvMatrix<float,3,3> mat_ucv1=X;
std::cout << "mat_ucv1= " << mat_ucv1 << std::endl;
CublasCvMatrix<float,3,3> mat_ucv2;
cvmInvert( &(CvMat)mat_ucv1, &(CvMat)mat_ucv2 );
std::cout << "mat_ucv2= " << mat_ucv2 << std::endl;
boost::numeric::ublas::c_matrix<float,3,3> c_mat;
c_mat = boost::numeric::ublas::prod (mat_ucv1,mat_ucv2);
std::cout << "c_mat= " << c_mat << std::endl;
CublasCvMatrix<float,3,3> mat_ucv3;
cvMatMul( &(CvMat)mat_ucv1 , &(CvMat)mat_ucv2, &(CvMat) mat_ucv3 );
std::cout << "mat_ucv3= " << mat_ucv3 << std::endl;
CublasCvVector<float,3> vec_ucv1;
vec_ucv1[0]=1 ; vec_ucv1[1]=2 ; vec_ucv1[2]=4;
std::cout << "vec_ucv1= " << vec_ucv1 << std::endl;
CublasCvVector<float,3> vec_ucv2 ;
vec_ucv2 =boost::numeric::ublas::prod (mat_ucv1,vec_ucv1);
std::cout << "vec_ucv2= " << vec_ucv2 << std::endl;
cvMatMul( &(CvMat)mat_ucv1 , &(CvMat)vec_ucv1, &(CvMat) vec_ucv2 );
std::cout << "vec_ucv2= " << vec_ucv2 << std::endl;
mat_ucv1=boost::numeric::ublas::identity_matrix<float>(3,3);
std::cout << "mat_ucv1= " << mat_ucv1 << std::endl;
boost::numeric::ublas::matrix<float> mat;
mat = mat_ucv2;
std::cout << "mat= " << mat << std::endl;
std::ofstream ofs("bar.txt");
//ofs.open();
streamOutUblasMatrix(mat, ofs);
ofs.close();
}