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

📄 comprow_double.cc

📁 http://gams.cam.nist.gov/acmd/Staff/RPozo/sparselib++.html
💻 CC
字号:
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*             ********   ***                                 SparseLib++    *//*          *******  **  ***       ***      ***                              *//*           *****      ***     ******** ********                            *//*            *****    ***     ******** ********              R. Pozo        *//*       **  *******  ***   **   ***      ***                 K. Remington   *//*        ********   ********                                 A. Lumsdaine   *//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*                                                                           *//*                                                                           *//*                     SparseLib++ : Sparse Matrix Library                   *//*                                                                           *//*               National Institute of Standards and Technology              *//*                        University of Notre Dame                           *//*              Authors: R. Pozo, K. Remington, A. Lumsdaine                 *//*                                                                           *//*                                 NOTICE                                    *//*                                                                           *//* Permission to use, copy, modify, and distribute this software and         *//* its documentation for any purpose and without fee is hereby granted       *//* provided that the above notice appear in all copies and supporting        *//* documentation.                                                            *//*                                                                           *//* Neither the Institutions (National Institute of Standards and Technology, *//* University of Notre Dame) nor the Authors make any representations about  *//* the suitability of this software for any purpose.  This software is       *//* provided ``as is'' without expressed or implied warranty.                 *//*                                                                           *//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*           Compressed row sparse matrix (0-based)                      *//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#include <iostream>#include <stdlib.h>#include "compcol_double.h"#include "comprow_double.h"#include "coord_double.h"#include "spblas.h"/*****************************//*  Constructor(s)           *//*****************************/CompRow_Mat_double::CompRow_Mat_double(void)        : val_(0), rowptr_(0), colind_(0), base_(0), nz_(0){        dim_[0] = 0;        dim_[1] = 0;}/*****************************//*  Copy constructor         *//*****************************/CompRow_Mat_double::CompRow_Mat_double(const CompRow_Mat_double &S) :          val_(S.val_), rowptr_(S.rowptr_), colind_(S.colind_), base_(S.base_),         nz_(S.nz_){        dim_[0] = S.dim_[0];        dim_[1] = S.dim_[1];}/***********************************//*  Construct from storage vectors *//***********************************/CompRow_Mat_double::CompRow_Mat_double(int M, int N, int nz, double *val,                                      int *r, int *c, int base) :        val_(val, nz), rowptr_(r, M+1), colind_(c, nz), base_(base), nz_(nz) {        dim_[0] = M;        dim_[1] = N;}CompRow_Mat_double::CompRow_Mat_double(int M, int N, int nz,                    const VECTOR_double &val, const VECTOR_int &r,                    const VECTOR_int &c, int base) :        val_(val), rowptr_(r), colind_(c), base_(base), nz_(nz){        dim_[0] = M;        dim_[1] = N;} /**********************************************************************//*  Construct a CompRow_Mat_double from a CompCol_Mat_double            *//*  (i.e. convert compressed column storage to compressed row storage)*//**********************************************************************/CompRow_Mat_double::CompRow_Mat_double(const CompCol_Mat_double &C) :          val_(C.NumNonzeros()), rowptr_(C.dim(0) +1),         colind_(C.NumNonzeros()), base_(C.base()), nz_(C.NumNonzeros()){        dim_[0] = C.dim(0);        dim_[1] = C.dim(1);                int i,j;        VECTOR_int tally(C.dim(0)+1, 0);//      First pass through nonzeros.  Tally entries in each row.//      And calculate rowptr array.        for (i=0;i<nz_;i++) tally(C.row_ind(i))++;        rowptr_(0) = 0;        for (j=0;j<dim_[0];j++) rowptr_(j+1) = rowptr_(j)+tally(j);//      Make copy of rowptr for use in second pass.        tally = rowptr_; //      Second pass through nonzeros.   Fill in index and value entries.        int count = 0;        for (i=1;i<=dim_[1];i++)        {           for (j=count;j<C.col_ptr(i);j++)           {              val_(tally(C.row_ind(j))) = C.val(j);              colind_(tally(C.row_ind(j))) = i-1;              tally(C.row_ind(count))++;              count++;           }        }}/**********************************************************************//*  Construct a CompRow_Mat_double from a Coord_Mat_double              *//*  (i.e. convert coordinate storage to compressed row storage)       *//**********************************************************************/CompRow_Mat_double::CompRow_Mat_double(const Coord_Mat_double &CO) :         val_(CO.NumNonzeros()), rowptr_(CO.dim(0)+1),         colind_(CO.NumNonzeros()), base_(CO.base()), nz_(CO.NumNonzeros()){        dim_[0] = CO.dim(0);        dim_[1] = CO.dim(1);        int i;        VECTOR_int tally(CO.dim(0)+1, 0);//      First pass through nonzeros.  Tally entries in each row.//      And calculate rowptr array.        for (i=0;i<nz_;i++) tally(CO.row_ind(i))++;        rowptr_(0) = 0;        for (i=0;i<dim_[0];i++) rowptr_(i+1) = rowptr_(i)+tally(i);//      Make copy of rowptr for use in second pass.        tally = rowptr_;//      Second pass through nonzeros.   Fill in index and value entries.        for (i=0;i<nz_;i++)        {           val_(tally(CO.row_ind(i))) = CO.val(i);           colind_(tally(CO.row_ind(i))) = CO.col_ind(i);           tally(CO.row_ind(i))++;        }}              /***************************//* Assignment operator...  *//***************************/CompRow_Mat_double& CompRow_Mat_double::operator=(const CompRow_Mat_double &R){        dim_[0] = R.dim_[0];        dim_[1] = R.dim_[1];        base_   = R.base_;        nz_     = R.nz_;        val_    = R.val_;        rowptr_ = R.rowptr_;        colind_ = R.colind_;        return *this;}/***************************//* newsize()               *//***************************/CompRow_Mat_double& CompRow_Mat_double::newsize(int M, int N, int nz){        dim_[0] = M;        dim_[1] = N;        nz_     = nz;        val_.newsize(nz);        rowptr_.newsize(M+1);        colind_.newsize(nz);        return *this;}/*********************//*   Array access    *//*********************/double CompRow_Mat_double::operator()(int i, int j)  const{        for (int t=rowptr_(i); t<rowptr_(i+1); t++)           if (colind_(t) == j) return val_(t);        if (i < dim_[0] && j < dim_[1]) return 0.0;        else        {            std::cerr << "Array accessing exception -- out of bounds." << "\n";            return (0);        }}double& CompRow_Mat_double::set(int i, int j){        for (int t=rowptr_(i); t<rowptr_(i+1); t++)           if (colind_(t) == j) return val_(t);        std::cerr << "Array element (" << i << "," << j <<                                 ") not in sparse structure -- cannot assign."             << "\n";                  exit(1);    return val_(0);   // // return to suppress compiler warning message}/*************//*   I/O     *//*************/using namespace std;std::ostream& operator << (std::ostream & os, const CompRow_Mat_double & mat){        int M = mat.dim(0);        int N = mat.dim(1);        int rowp1, colp1;        int flag = 0;        std::ios::fmtflags olda = os.setf(ios::right,ios::adjustfield);        std::ios::fmtflags oldf = os.setf(ios::scientific,ios::floatfield);        	int oldp = os.precision(12);//      Loop through rows...        for (int i = 0; i < M ; i++)           for (int j=mat.row_ptr(i);j<mat.row_ptr(i+1);j++)           {                 rowp1 =  i + 1;              colp1 =  mat.col_ind(j) + 1;              if ( rowp1 == M && colp1 == N ) flag = 1;              os.width(14);              os <<  rowp1 ; os << "    " ;              os.width(14);              os <<  colp1 ; os << "    " ;              os.width(20);              os <<  mat.val(j) << "\n";           }        if (flag == 0)        {           os.width(14);           os <<  M ; os << "    " ;           os.width(14);           os <<  N ; os << "    " ;           os.width(20);           os <<  mat(M-1,N-1) << "\n";        }        os.setf(olda,ios::adjustfield);        os.setf(oldf,ios::floatfield);        os.precision(oldp);        return os;}/***************************************//*  Matrix-MV_Vector multiplication    *//***************************************/VECTOR_double CompRow_Mat_double::operator*(const VECTOR_double &x)         const{        int M = dim_[0];        int N = dim_[1];//      Check for compatible dimensions:        if (x.size() != N)         {           std::cerr << "Error in CompCol Matvec -- incompatible dimensions."                 << "\n";           exit(1);           return x;      // return to suppress compiler warning message         }         VECTOR_double result(M, 0.0);         VECTOR_double work(M);           int descra[9];         descra[0] = 0;         descra[1] = 0;         descra[2] = 0;         F77NAME(dcsrmm) (0, M, 1, N, 1.0,                  descra, &val_(0), &colind_(0), &rowptr_(0),                  &x(1), N, 1.0, &result(0), M,                  &work(0), M);         return result;}/*************************************************//* Matrix-Transpose-MV_Vector multiplication...  *//*************************************************/VECTOR_double CompRow_Mat_double::trans_mult(const VECTOR_double &x)            const{          int M = dim_[0];          int N = dim_[1];//        Check for compatible dimensions:          if (x.size() != M)           {             std::cerr << "Error in CompCol Matvec -- incompatible dimensions."                   << "\n";             exit(1);             return x;   // return to suppress compiler warning message           }           VECTOR_double result(N, 0.0);           VECTOR_double work(N);             int descra[9];           descra[0] = 0;           descra[1] = 0;           descra[2] = 0;           F77NAME(dcsrmm) (1, N, 1, M, 1.0,                        descra, &val_(0), &colind_(0), &rowptr_(0),                    &x(0), M, 1.0, &result(1), N,                    &work(1), N);           return result;}

⌨️ 快捷键说明

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