inline
DenseLinAlgPack::DVectorSlice
AbstractLinAlgPack::dense_view( SpVectorSlice& sv_rhs )
{
  return sv_rhs.nz()
    ? DVectorSlice( &sv_rhs.begin()->value(), sv_rhs.nz(), 2 )
    : DVectorSlice( NULL, 0, 0 );
}
inline
const DenseLinAlgPack::DVectorSlice
AbstractLinAlgPack::dense_view( const SpVectorSlice& sv_rhs )
{
  return sv_rhs.nz()
    ? DVectorSlice( &const_cast<SpVectorSlice&>(sv_rhs).begin()->value(), sv_rhs.nz(), 2 )
    : DVectorSlice( NULL, 0, 0 );
}
inline
const DVectorSlice DMatrixSlice::col(size_type j) const {
  validate_col_subscript(j);
  return DVectorSlice( const_cast<value_type*>(ptr_) + (j-1)*max_rows(), rows(), 1 );
} 
inline
DVectorSlice	DMatrixSlice::col(size_type j) {
  validate_col_subscript(j);
  return DVectorSlice( ptr_ + (j-1)*max_rows(), rows(), 1 );
} 
inline
const DVectorSlice DMatrixSlice::row(size_type i) const {
  validate_row_subscript(i);
  return DVectorSlice( const_cast<value_type*>(ptr_) + (i-1), cols(), max_rows() );
} 
inline
DVectorSlice  DMatrixSlice::row(size_type i) {
  validate_row_subscript(i);
  return DVectorSlice( ptr_ + (i-1), cols(), max_rows() );
} 
inline
DVectorSlice	DMatrix::col(size_type j)
{
  validate_col_subscript(j);
  return DVectorSlice( col_ptr(1) + (j-1) * rows(), rows(), 1 );
} 
inline
DVectorSlice DMatrix::row(size_type i)
{
  validate_row_subscript(i);
  return DVectorSlice( col_ptr(1) + (i-1), cols(), rows() );
}