00001 /* 00002 File: SubSMat.cc 00003 00004 Function: Implements SubSMat.h 00005 00006 Author(s): Andrew Willmott 00007 00008 Copyright: (c) 1995-2000, Andrew Willmott 00009 00010 Notes: 00011 00012 */ 00013 00014 00015 #include "vl/SubSMat.h" 00016 #include "vl/SparseMat.h" 00017 #include "vl/SubSVec.h" 00018 00019 00020 // --- SubSMat Constructors & Destructors ------------------------------------- 00021 00022 00023 TSubSMat::TSubSMat(Int m, Int n, Int start, TMSparseVec *target) : 00024 rows(m), cols(n), start(start), target(target) 00025 { 00026 } 00027 00028 TSubSMat::TSubSMat(const TSubSMat &m) : 00029 rows(m.rows), cols(m.cols), start(m.start), target(m.target) 00030 { 00031 } 00032 00033 00034 // --- SubSMat Assignment Operators ------------------------------------------- 00035 00036 TSubSMat &TSubSMat::operator = (const TSubSMat &m) 00037 { 00038 Int i; 00039 00040 for (i = 0; i < m.Rows(); i++) 00041 SELF[i] = m[i]; 00042 00043 return(SELF); 00044 } 00045 00046 TSubSMat &TSubSMat::operator = (const TSparseMat &m) 00047 { 00048 Int i; 00049 00050 for (i = 0; i < m.Rows(); i++) 00051 SELF[i] = m[i]; 00052 00053 return(SELF); 00054 } 00055 00056 TSubSMat &TSubSMat::operator = (const TMat &m) 00057 { 00058 Int i; 00059 00060 for (i = 0; i < m.Rows(); i++) 00061 SELF[i] = m[i]; 00062 00063 return(SELF); 00064 } 00065 00066 TSubSMat sub(const TSparseMat &m, Int top, Int left, Int nrows, Int ncols) 00067 { 00068 Assert(left >= 0 && ncols > 0 && left + ncols <= m.Cols(), 00069 "(sub(SparseMat)) illegal subset of matrix"); 00070 Assert(top >= 0 && nrows > 0 && top + nrows <= m.Rows(), 00071 "(sub(SparseMat)) illegal subset of matrix"); 00072 00073 return(TSubSMat(nrows, ncols, left, m.Ref() + top)); 00074 } 00075 00076 TSubSMat sub(const TSparseMat &m, Int nrows, Int ncols) 00077 { 00078 Assert(ncols > 0 && ncols <= m.Cols(), 00079 "(sub(SparseMat)) illegal subset of matrix"); 00080 Assert(nrows > 0 && nrows <= m.Rows(), 00081 "(sub(SparseMat)) illegal subset of matrix"); 00082 00083 return(TSubSMat(nrows, ncols, 0, m.Ref())); 00084 } 00085 00086 TMSubSVec col(const TSparseMat &m, Int i) 00087 { 00088 CheckRange(i, 0, m.Cols(), "(col(SparseMat)) illegal column index"); 00089 00090 return(TSubSVec(i, m.Rows(), m.Ref(), m.Cols())); 00091 } 00092 00093 TMSubSVec diag(const TSparseMat &m, Int diagNum) 00094 { 00095 if (diagNum == 0) 00096 return(TSubSVec(0, Min(m.Rows(), m.Cols()), m.Ref(), m.Cols() + 1)); 00097 else if (diagNum < 0) 00098 return(TSubSVec(0, Min(m.Rows() + diagNum, m.Cols()), 00099 m.Ref() - diagNum, m.Cols() + 1)); 00100 else 00101 return(TSubSVec(diagNum, Min(m.Cols() - diagNum, m.Rows()), m.Ref(), 00102 m.Cols() + 1)); 00103 } 00104