Exemple #1
0
static void copy_large_entries(const DynamicSparseVector &u, double threshhold, StaticSparseVector &v)
{
   DynamicSparseVector::const_iterator p;
   for(p=u.begin(); p!=u.end(); ++p){
      if(std::fabs(p->value)>threshhold) v.push_back(*p);
   }
}
Exemple #2
0
static double vector_norm(const DynamicSparseVector &v)
{
   double norm_squared=0;
   DynamicSparseVector::const_iterator p;
   for(p=v.begin(); p!=v.end(); ++p) norm_squared+=sqr(p->value);
   return std::sqrt(norm_squared);
}
Exemple #3
0
void SparseMatrixDynamicCSR::
add_sparse_row(int i, const DynamicSparseVector &x, double multiplier)
{
    assert(i>=0 && i<m);
    DynamicSparseVector &r=row[i];
    DynamicSparseVector::iterator p=r.begin();
    DynamicSparseVector::const_iterator q=x.begin();
    while(p!=r.end() && q!=x.end()){
        if(p->index<q->index) ++p;
        else if(p->index>q->index){
            r.insert(p, SparseEntry(q->index, multiplier*q->value));
            ++q;
        }else{
            p->value+=multiplier*q->value;
            ++p;
            ++q;
        }
    }
    for(; q!=x.end(); ++q) r.push_back(SparseEntry(q->index, multiplier*q->value));
}
Exemple #4
0
static double dot_product(const StaticSparseVector &u, const DynamicSparseVector &v)
{
   StaticSparseVector::const_iterator p=u.begin();
   if(p==u.end()) return 0;
   DynamicSparseVector::const_iterator q=v.begin();
   if(q==v.end()) return 0;
   double result=0;
   for(;;){
      if(p->index < q->index){
         ++p; if(p==u.end()) break;
      }else if(p->index > q->index){
         ++q; if(q==v.end()) break;
      }else{ // p->index == q->index
         result+=p->value*q->value;
         ++p; if(p==u.end()) break;
         ++q; if(q==v.end()) break;
      }
   }
   return result;
}
Exemple #5
0
static void add_to_vector(double multiplier, const StaticSparseVector &u, DynamicSparseVector &v)
{
   StaticSparseVector::const_iterator p=u.begin();
   if(p==u.end()) return;
   DynamicSparseVector::iterator q=v.begin();
   for(;;){
      if(q==v.end()) break;
      if(p->index < q->index){
         q=v.insert(q, SparseEntry(p->index, multiplier*p->value));
         ++p; if(p==u.end()) return;
      }else if(p->index > q->index){
         ++q; if(q==v.end()) break;
      }else{ // p->index == q->index){
         q->value+=multiplier*p->value;
         ++p; if(p==u.end()) return;
         ++q; if(q==v.end()) break;
      }
   }
   for(;;){
      v.push_back(SparseEntry(p->index, multiplier*p->value));
      ++p; if(p==u.end()) return;
   }
}
Exemple #6
0
static void copy_column(int colstart, int nextcolstart, const int *rowindex, const double *value,
                        DynamicSparseVector &v)
{
   for(int i=colstart; i<nextcolstart; ++i)
      v.push_back(SparseEntry(rowindex[i], value[i]));
}