⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vlastreams.cc

📁 basic linear algebra classes and applications (SVD,interpolation, multivariate optimization)
💻 CC
📖 第 1 页 / 共 3 页
字号:
// This may look like C code, but it is really -*- C++ -*-/* ************************************************************************ * *		  Verify streams over matrices and vectors * * * $Id: vlastreams.cc,v 1.1 1998/12/13 23:29:39 oleg Exp oleg $ * ************************************************************************ */#include "LAStreams.h"#include "builtin.h"#include <math.h>#include "iostream.h"#include <float.h>/* *------------------------------------------------------------------------ *	   Test allocation functions and compatibility check */static void test_LAStreams(const int rsize, const int csize){  const double pattern = 4.25;  const double incr = 0.5;  cout << "\n---> Test LAStreams\n";    Matrix m(2,rsize+1,0,csize-1);  {    cout << "Fill out the matrix in the natural order via an ElementAction..."          << endl;    struct filler : public ElementAction    {      double counter;      const double incr;      void operation(REAL& element, const int i, const int j)	  		{ element = (counter += incr); }      filler(const double _init_val, const double _incr) :      	counter(_init_val), incr(_incr) {}    };    m.apply(filler(pattern,incr));    assert( of_every(m) > pattern );    assert( !(of_every(m) == pattern+incr) );	// There is at least one element    assert( !(m != pattern+incr) );				// == and != to pattern+incr  }    {    cout << "Check the filling order by a direct access. "    	    "The row index varies first!" << endl;    ConstMatrixDA ma(m);    double counter = pattern;    for(register int j=ma.q_col_lwb(); j<=ma.q_col_upb(); j++)      for(register int i=ma.q_row_lwb(); i<=ma.q_row_upb(); i++)         assert( ma(i,j) == (counter += incr) );    assert( counter == pattern + m.q_no_elems() * incr );  }   {    cout << "Check the filling order via ElementWiseConstAction" << endl;    struct checker : public ElementWiseConstAction    {      double counter;      double incr;      void operator () (const REAL element)       	{ assert(element == (counter += incr)); }      checker(const double _init_val, const double _incr) :      	counter(_init_val), incr(_incr) {}    };    of_every(m).apply(checker(pattern,incr));  }   {    cout << "Check the filling order via AREALStreamIn" << endl;    LAStreamIn m_str(m);    assert( !m_str.eof() );    assert( m_str.bof() );    double counter = pattern;    AREALMark mark;    assert( !mark ); // a user-created AREALMark is always invalid...    assert( (bool)mark == false );    mark = m_str.tell();    assert( (bool)mark );	// the mark becomes valid now    assert( m_str.get_pos(mark) == rowcol(m.q_row_lwb(),m.q_col_lwb()) );    for(register int i=0; i<m.q_no_elems(); i++)    {      assert( !m_str.eof() );      assert( m_str.peek() == (counter += incr) );      assert( m_str.get() == counter );      assert( !m_str.bof() );    }    assert( m_str.eof() );    assert( m_str.get_pos(m_str.tell_prev()) ==    	    rowcol(m.q_row_upb(),m.q_col_upb()) );    cout << "\trewinding the stream and checking again..." << endl;    m_str.rewind();    assert( !m_str.eof() );    assert( m_str.bof() );    assert( m_str.get() == pattern + incr );    assert( m_str.peek() == pattern + incr + incr );    m_str.seek(mark);    assert( !m_str.eof() );    assert( m_str.bof() );    assert( m_str.peek() == pattern + incr );    assert( m_str.peek() == pattern + incr );    assert( m_str.get() == pattern + incr );  }     {    cout << "Check the filling order via AREALStreamOut" << endl;    Matrix m_copy = m;		// Duplicate the matrix    assert( m_copy == m );    LAStreamOut m_str(m_copy);    assert( !m_str.eof() );    assert( m_str.bof() );    double counter = pattern;    AREALMark mark = m_str.tell();    assert( (bool)mark );    assert( m_str.get_pos(mark) ==     	    rowcol(m_copy.q_row_lwb(),m_copy.q_col_lwb()) );    while( !m_str.eof() )    {      m_str.peek() -= (counter += incr);      assert( m_str.get() == 0 );      assert( !m_str.bof() );    }    assert( m_str.get_pos(m_str.tell_prev()) ==    	    rowcol(m_copy.q_row_upb(),m_copy.q_col_upb()) );    verify_element_value(m_copy,0);    assert( !(m_copy == m) );        cout << "\tCopying the matrices via streams" << endl;    m_str.seek(m.q_no_elems(),LAS::end);	assert( m_str.bof() );    for(LAStreamIn m_in(m); !m_in.eof(); )      m_str.get() = m_in.get();    assert( m_str.eof() );    assert( m_copy == m );    cout << "\tChecking various seeks" << endl;    m_str.seek(-m.q_no_elems());    assert( !m_str.eof() );    assert( m_str.bof() );    assert( m_str.peek() == pattern + incr );    assert( m_str.peek() == pattern + incr );    assert( m_str.get() == pattern + incr );    assert( m_str.get() == pattern + incr+incr );	m_str.seek(-1,LAS::cur);    assert( m_str.get() == pattern + incr+incr );	assert( !m_str.bof() );	m_str.seek(m.q_no_elems()-1,LAS::beg);    assert( m_str.peek() == pattern + m.q_no_elems()*incr );	m_str.ignore(1);	assert( m_str.eof() );	m_str.seek(1,LAS::end);    assert( m_str.get() == pattern + m.q_no_elems()*incr );	assert( m_str.eof() );	m_str.seek(0,LAS::beg);    assert( m_str.peek() == pattern + incr );	m_str.seek(m.q_no_elems(),LAS::cur);	assert( m_str.eof() );  }   cout << "\nDone\n";}static void test_LAStrideStreams(const int rsize, const int csize,				 const int stride){  const double pattern = 4.25;  const double incr = 1.5;  cout << "\n---> Test LAStrideStreams over " << rsize << 'x' << csize  	   << " matrix with a stride of " << stride << endl;    Matrix m(-1,rsize-2,2,csize+1);  {    cout << "Fill out the matrix in the natural order via ElementWiseAction..."          << endl;    struct filler : public ElementWiseAction    {      double counter;      const double incr;      void operator () (REAL& element) { element = counter; counter += incr; }      filler(const double _init_val, const double _incr) :      	counter(_init_val), incr(_incr) {}    };    to_every(m).apply(filler(pattern,incr));    assert( of_every(m).max_abs() == pattern + incr*(m.q_no_elems()-1) );    assert( abs( of_every(m).sum() -     	         (2*pattern+incr*(m.q_no_elems()-1))/2*m.q_no_elems() )    	         <= FLT_EPSILON );  }  {    cout << "Check the filling order via LAStrideStreamIn" << endl;    LAStrideStreamIn m_str(m,stride);    assert( !m_str.eof() );    assert( m_str.bof() );    double counter = pattern;    const double stride_incr = incr * stride;    AREALMark mark = m_str.tell();    assert( (bool)mark );    assert( m_str.get_pos(mark) ==     	    rowcol(m.q_row_lwb(),m.q_col_lwb()) );    register int stride_counter = 0;    while( !m_str.eof() )    {      assert( m_str.peek() == counter );      assert( m_str.get() == counter );      assert( !m_str.bof() );      counter += stride_incr;      stride_counter++;    }    cout << "\tstrides made: " << stride_counter << endl;    assert( stride_counter == (m.q_no_elems() + stride -1) / stride );    assert( stride != 1 || m_str.get_pos(m_str.tell_prev()) ==    	    rowcol(m.q_row_upb(),m.q_col_upb()) );    m_str.seek(mark);    assert( !m_str.eof() );    assert( m_str.bof() );    assert( m_str.peek() == pattern );    assert( m_str.get() == pattern );  }    {    cout << "Doubling every " << stride << " element " << endl;    LAStrideStreamOut m_str(m,stride);    assert( !m_str.eof() );    assert( m_str.bof() );    double counter = pattern;    const double stride_incr = incr * stride;    AREALMark mark = m_str.tell();    assert( (bool)mark );    assert( m_str.get_pos(mark) ==     	    rowcol(m.q_row_lwb(),m.q_col_lwb()) );    while( !m_str.eof() )    {      assert( m_str.peek() == counter );      m_str.get() += counter;      assert( !m_str.bof() );      counter += stride_incr;    }    cout << "\tand checking it out..." << endl;    register int stride_counter = 0;    LAStreamIn m_in(m);    counter = pattern;    for(register int i=0; !m_in.eof(); )    {      assert( m_in.get() == (i==0 ? stride_counter++, 2*counter : counter) );      counter += incr;      if( ++i == stride )        i = 0;    }    cout << "\tstrides made: " << stride_counter << endl;    assert( stride_counter == (m.q_no_elems() + stride -1) / stride );    assert( stride != 1 || m_str.get_pos(m_str.tell_prev()) ==    	    rowcol(m.q_row_upb(),m.q_col_upb()) );	{	   cout << "\tchecking it out using regular stream with ignore..." << endl;	   register int new_stride_counter = 0;	   LAStreamIn m_in(m);	   counter = pattern;	   while( !m_in.eof() )	   {		 assert( m_in.get() == (new_stride_counter++, 2*counter) );		 m_in.ignore(stride-1);		 counter += stride*incr;	   }	   cout << "\tstrides made: " << new_stride_counter << endl;	   assert( new_stride_counter == stride_counter );	}    cout << "\tChecking various seeks" << endl;    m_str.seek(-stride_counter);    assert( !m_str.eof() );    assert( m_str.bof() );    assert( m_str.peek() == 2*pattern );    assert( m_str.get() == 2*pattern );	if( stride_counter == 1 )	// The stride was way too big	{  	  m_str.seek(-1,LAS::cur);	  assert( m_str.get() == 2*pattern );	}	else	{  	  assert( m_str.get() == 2*(pattern + stride*incr) );	  m_str.seek(-1,LAS::cur);      assert( m_str.get() == 2*(pattern + stride*incr) );	}	assert( !m_str.bof() );	m_str.seek(stride_counter-1,LAS::beg);    assert( m_str.peek() == 2*(pattern + stride*(stride_counter-1)*incr) );	m_str.ignore(1);	assert( m_str.eof() );	m_str.seek(1,LAS::end);    assert( m_str.get() == 2*(pattern + stride*(stride_counter-1)*incr) );	assert( m_str.eof() );	m_str.seek(0,LAS::beg);    assert( m_str.peek() == 2*pattern );	m_str.seek(m.q_no_elems(),LAS::cur);	assert( m_str.eof() );  }  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -