PLearn 0.1
Public Member Functions | Public Attributes
PLearn::SparseMatrix Class Reference

#include <SparseMatrix.h>

Collaboration diagram for PLearn::SparseMatrix:
Collaboration graph
[legend]

List of all members.

Public Member Functions

int length () const
int width () const
 SparseMatrix ()
 SparseMatrix (int nbrows, int n_columns, int n_non_zero)
 SparseMatrix (Vec bRow, Vec eRow, Vec Row, Vec Values, int nbrows)
 SparseMatrix (Mat m)
 convert Mat into SparseMatrix:
 SparseMatrix (string filename)
void resize (int nbrows, int n_columns, int n_non_zero)
void loadFortran (const char *filename)
 load SparseMatrix from file in ascii Harwell-Boeing Fortran format: 4-line header, followed by beginRow, row, and values.
void saveFortran (const char *filename)
Mat toMat ()
 convert to the equivalent full matrix
void product (const Vec &x, Vec &y)
 multiply a sparse matrix by a full vector and set resulting vector y = matrix * x
void diag (Vec &d)
 extract the diagonal of the sparse matrix: d[i] = A[i,i]
void diagonalOfSquare (Vec &d)
 d = diagonal(A'*A), i.e.
real dotRow (int i, Vec v)
 return dot product of i-th row with vector v
real dotColumn (int j, Vec v)
 return dot product of j-th column with vector v

Public Attributes

int n_rows
 the dimensions of the matrix are: n_rows x beginRow.length()
Vec beginRow
Vec endRow
Vec row
Vec values

Detailed Description

Sparse matrices

beginRow(n_columns): beginning of block of (not necessarily contiguous) elements of column j in the values vector endRow(n_columns): last element of block of (not necessarily contiguous) elements of column j in the values vector row(n_non_zero_elements): row of a non-zero element values(n_non_zero_elements): value of a non-zero element so for example values[k] is the value of an element (i,j) of the matrix such that row[k]=i and beginRow[i]<=k<=endRow[i].

Definition at line 57 of file SparseMatrix.h.


Constructor & Destructor Documentation

PLearn::SparseMatrix::SparseMatrix ( ) [inline]

Definition at line 68 of file SparseMatrix.h.

{}
PLearn::SparseMatrix::SparseMatrix ( int  nbrows,
int  n_columns,
int  n_non_zero 
) [inline]

Definition at line 69 of file SparseMatrix.h.

        : n_rows(nbrows), beginRow(n_columns), endRow(n_columns), 
          row(n_non_zero), values(n_non_zero) {}
PLearn::SparseMatrix::SparseMatrix ( Vec  bRow,
Vec  eRow,
Vec  Row,
Vec  Values,
int  nbrows 
) [inline]

Definition at line 72 of file SparseMatrix.h.

        : n_rows(nbrows), beginRow(bRow), endRow(eRow),
          row(Row), values(Values) {}
PLearn::SparseMatrix::SparseMatrix ( Mat  m)

convert Mat into SparseMatrix:

Definition at line 149 of file SparseMatrix.cc.

References b, beginRow, PLearn::TVec< T >::data(), endRow, i, j, PLearn::TMat< T >::mod(), n_rows, PLearn::TVec< T >::resize(), row, values, and PLearn::TMat< T >::width().

    : n_rows(A.length()), beginRow(A.width()), endRow(A.width())
{
    int n_nonzero=0;
    for (int i=0;i<n_rows;i++)
    {
        real* Ai=A[i];
        for (int j=0;j<A.width();j++)
            if (Ai[j]!=0) n_nonzero++;
    }
    row.resize(n_nonzero);
    values.resize(n_nonzero);
    int mod = A.mod();
    int k=0;
    real* v=values.data();
    real* r=row.data();
    real* b=beginRow.data();
    real* e=endRow.data();
    for (int j=0;j<A.width();j++)
    {
        real* Aij = &A(0,j);
        b[j] = k;
        for (int i=0;i<n_rows;i++,Aij+=mod)
            if (*Aij!=0)
            {
                r[k] = i;
                v[k] = *Aij;
                k++;
            }
        e[j] = k-1;
    }
}

Here is the call graph for this function:

PLearn::SparseMatrix::SparseMatrix ( string  filename) [inline]

Definition at line 79 of file SparseMatrix.h.

{ loadFortran(filename.c_str()); }

Member Function Documentation

void PLearn::SparseMatrix::diag ( Vec d)

extract the diagonal of the sparse matrix: d[i] = A[i,i]

Definition at line 204 of file SparseMatrix.cc.

References beginRow, PLearn::TVec< T >::data(), endRow, j, PLearn::TVec< T >::length(), row, and values.

{
    real* d_ = d.data();
    real* A_ = values.data();
    int k;
    for (int j=0;j<beginRow.length();j++)
    {
        int end=int(endRow[j]);
        for (k=(int)beginRow[j];k<=end && int(row[k])!=j;k++);
        if (k<=end)
            d_[j]=A_[k];
        else
            d_[j]=0;
    }
}

Here is the call graph for this function:

void PLearn::SparseMatrix::diagonalOfSquare ( Vec d)

d = diagonal(A'*A), i.e.

d[i] = |A[i]|^2 where A[i] is i-th column

Definition at line 220 of file SparseMatrix.cc.

References beginRow, PLearn::TVec< T >::data(), endRow, j, PLearn::TVec< T >::length(), and values.

{
    real* d_ = d.data();
    real* A_ = values.data();
    int k;
    for (int j=0;j<beginRow.length();j++)
    {
        int end=int(endRow[j]);
        real sum2=0;
        for (k=(int)beginRow[j];k<=end;k++)
            sum2 += A_[k]*A_[k];
        d_[j]=sum2;
    }
}

Here is the call graph for this function:

real PLearn::SparseMatrix::dotColumn ( int  j,
Vec  v 
)

return dot product of j-th column with vector v

Definition at line 243 of file SparseMatrix.cc.

References beginRow, PLearn::TVec< T >::data(), endRow, PLearn::TVec< T >::length(), length(), PLERROR, row, and values.

{
#ifdef BOUNDCHECK
    if (v.length()!=length())
        PLERROR("SparseMatrix::dotColumn(%d,v), v.length_=%d != matrix length=%d",
                j,v.length(),length());
#endif
    real s=0;
    real* v_=v.data();
    real* A_=values.data();
    for (int k=int(beginRow[j]);k<=int(endRow[j]);k++)
        s += A_[k] * v_[int(row[k])];
    return s;
}

Here is the call graph for this function:

real PLearn::SparseMatrix::dotRow ( int  i,
Vec  v 
)

return dot product of i-th row with vector v

Definition at line 236 of file SparseMatrix.cc.

References PLERROR.

{
    PLERROR("SparseMatrix is not appropriate to perform dotRow operations");
    return 0;
}
int PLearn::SparseMatrix::length ( ) const [inline]

Definition at line 65 of file SparseMatrix.h.

Referenced by dotColumn().

{ return n_rows; }

Here is the caller graph for this function:

void PLearn::SparseMatrix::loadFortran ( const char *  filename)

load SparseMatrix from file in ascii Harwell-Boeing Fortran format: 4-line header, followed by beginRow, row, and values.

Definition at line 52 of file SparseMatrix.cc.

References i, and PLERROR.

{
    FILE* fp=fopen(filename,"r");
    if (!fp)
        PLERROR("SparseMatrix::loadFortran, can't open file %s\n",filename);
    int n_cols,n_nonzero;
    fscanf(fp,"%*72c%*s%*s%*s%d%d%d%*d",&n_rows, &n_cols, &n_nonzero); 
    fscanf(fp,"%*s %*s %*s %*s"); // skip some format infos
    beginRow.resize(n_cols);
    endRow.resize(n_cols);
    values.resize(n_nonzero);
    row.resize(n_nonzero);
    real *brow = beginRow.data();
    real *erow = endRow.data();
    real *v = values.data();
    real *r = row.data();
    int i;
    for (i = 0; i < n_cols; i++) 
    { 
#ifdef USEFLOAT
        fscanf(fp, "%f", &brow[i]); 
#endif
#ifdef USEDOUBLE
        fscanf(fp, "%lf", &brow[i]); 
#endif
        brow[i]--; 
        if (i>0) erow[i-1]=brow[i]-1;
    }
    erow[n_cols-1]=n_nonzero-1;
    fscanf(fp,"%d",&i);
    if (i-1!=n_nonzero) 
        PLERROR("SparseMatrix::loadFortran, inconsistent nnz %d vs %d",
                n_nonzero,i);
    for (i=0;i<n_nonzero;i++)
    {
#ifdef USEFLOAT
        fscanf(fp, "%f", &r[i]); 
#endif
#ifdef USEDOUBLE
        fscanf(fp, "%lf", &r[i]); 
#endif
        r[i]--;
    }
    for (i=0;i<n_nonzero;i++)
#ifdef USEFLOAT
        fscanf(fp, "%f", &v[i]); 
#endif
#ifdef USEDOUBLE
    fscanf(fp, "%lf", &v[i]); 
#endif
}
void PLearn::SparseMatrix::product ( const Vec x,
Vec y 
)

multiply a sparse matrix by a full vector and set resulting vector y = matrix * x

Definition at line 182 of file SparseMatrix.cc.

References beginRow, PLearn::TVec< T >::clear(), PLearn::TVec< T >::data(), endRow, i, j, PLearn::TVec< T >::length(), n_rows, PLERROR, row, and values.

{
    // y[i] = sum_j A[i,j] x[j]
    if (y.length()!=n_rows || x.length()!=beginRow.length())
        PLERROR("SparseMatrix(%d,%d)::product(x(%d) -> y(%d)): dimensions don't match",
                n_rows,beginRow.length(),x.length(),y.length());
    y.clear();
    real* y_=y.data();
    real* x_=x.data();
    real* A_=values.data();
    // loop over columns of A, accumulating in y
    for (int j=0;j<beginRow.length();j++)
    {
        real xj = x_[j];
        for (int k=(int)beginRow[j];k<=endRow[j];k++)
        {
            int i=(int)row[k];
            y_[i] += A_[k] * xj;
        }
    }
}

Here is the call graph for this function:

void PLearn::SparseMatrix::resize ( int  nbrows,
int  n_columns,
int  n_non_zero 
)

Definition at line 41 of file SparseMatrix.cc.

{
    n_rows=nbrows;
    beginRow.resize(n_columns);
    endRow.resize(n_columns);
    row.resize(n_non_zero);
    values.resize(n_non_zero);
}
void PLearn::SparseMatrix::saveFortran ( const char *  filename)

Definition at line 105 of file SparseMatrix.cc.

References i, and PLERROR.

{
    FILE* fp=fopen(filename,"w");
    if (!fp)
        PLERROR("SparseMatrix::saveFortran, can't open file %s\n",filename);
    int n_nonzero=values.length(), n_cols = endRow.length();
    fprintf(fp,"%72s%8s\n#\nrra %d %d %d 0\n","SparseMatrix         ",
            filename,
            n_rows, n_cols , n_nonzero);
    fprintf(fp,"          (10i8)          (10i8)            (8f10.3)            (8f10.3)\n");
    real *brow = beginRow.data();
    real *v = values.data();
    real *r = row.data();
    int i;
    for (i = 0; i < n_cols; i++) 
        //fprintf(fp, "%8d", (int)(brow[i]+1)); 
        fprintf(fp, "%7d ", (int)(brow[i]+1)); 
    fprintf(fp,"%8d\n",values.length()+1);
    for (i=0;i<n_nonzero;i++)
        fprintf(fp,"%7d ",(int)(r[i]+1));
    fprintf(fp,"\n");
    for (i=0;i<n_nonzero;i++)
        fprintf(fp,"%9f ",v[i]);
    fprintf(fp,"\n");
    fclose(fp);
}
Mat PLearn::SparseMatrix::toMat ( )

convert to the equivalent full matrix

Definition at line 133 of file SparseMatrix.cc.

References c, and PLearn::TMat< T >::length().

{
    int n_cols = beginRow.length();
    Mat A(n_rows,n_cols);
    real* r=row.data();
    real* v=values.data();
    for (int c=0;c<n_cols;c++)
    {
        real* Ac = &A(0,c);
        int e = (int)endRow[c];
        for (int k=(int)beginRow[c];k<=e;k++)
            Ac[n_cols*(int)r[k]]=v[k];
    }
    return A;
}

Here is the call graph for this function:

int PLearn::SparseMatrix::width ( ) const [inline]

Definition at line 66 of file SparseMatrix.h.

{ return beginRow.length(); }

Member Data Documentation

the dimensions of the matrix are: n_rows x beginRow.length()

Definition at line 59 of file SparseMatrix.h.

Referenced by PLearn::operator+(), product(), and SparseMatrix().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines