Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

SubMat.cc

Go to the documentation of this file.
00001 /*
00002     File:           SubMat.cc
00003 
00004     Function:       Implements SubMat.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/SubMat.h"
00016 #include "vl/Mat.h"
00017 
00018 
00019 // --- SubMat Constructors & Destructors --------------------------------------
00020 
00021 
00022 TSubMat::TSubMat(Int m, Int n, Int span, TMReal data[]) :
00023         rows(m), cols(n),
00024         span(span), data(data)
00025 {
00026 }
00027 
00028 TSubMat::TSubMat(const TSubMat &m) :
00029         rows(m.rows), cols(m.cols),
00030         span(m.span), data(m.data)
00031 {
00032 }
00033 
00034 
00035 // --- SubMat Assignment Operators --------------------------------------------
00036 
00037 
00038 TSubMat &TSubMat::operator = (const TSubMat &m)
00039 {   
00040     Assert(Rows() == m.Rows(), "(Mat::=) Matrix rows don't match");
00041     for (Int i = 0; i < Rows(); i++) 
00042         SELF[i] = m[i];
00043 
00044     return(SELF);
00045 }
00046       
00047 TSubMat &TSubMat::operator = (const TMat &m)
00048 {
00049     Assert(Rows() == m.Rows(), "(Mat::=) Matrix rows don't match");
00050     for (Int i = 0; i < Rows(); i++) 
00051         SELF[i] = m[i];
00052 
00053     return(SELF);
00054 }
00055 
00056 
00057 // --- Sub functions: Mat ------------------------------------------------------
00058 
00059 
00060 TSubMat sub(const TMat &m, Int top, Int left, Int height, Int width)
00061 {
00062     Assert(left >= 0 && width > 0 && left + width <= m.Cols(), "(sub(Mat)) illegal subset of matrix");
00063     Assert(top >= 0 && height > 0 && top + height <= m.Rows(), "(sub(Mat)) illegal subset of matrix");
00064 
00065     TSubMat result(height, width, m.Cols(), m.Ref() + top * m.Cols() + left);
00066 
00067     return(result);
00068 }
00069 
00070 TSubMat sub(const TMat &m, Int nrows, Int ncols)
00071 {
00072     Assert(ncols > 0 && nrows > 0 && nrows <= m.Rows() && ncols <= m.Cols(), 
00073         "(sub(Mat)) illegal subset of matrix");
00074 
00075     TSubMat result(nrows, ncols, m.Cols(), m.Ref());
00076 
00077     return(result);
00078 }
00079 
00080 TMSubVec col(const TMat &m, Int i)
00081 {
00082     CheckRange(i, 0, m.Cols(), "(col(Mat)) illegal column index");
00083 
00084     return(TMSubVec(m.Rows(), m.Cols(), m.Ref() + i));
00085 }
00086 
00087 TMSubVec row(const TMat &m, Int i)
00088 {
00089     CheckRange(i, 0, m.Rows(), "(row(Mat)) illegal row index");
00090 
00091     return(TMSubVec(m.Cols(), 1, m[i].Ref()));
00092 }
00093 
00094 TMSubVec diag(const TMat &m, Int diagNum)
00095 {
00096     CheckRange(diagNum, 1 - m.Rows(), m.Cols(), "(row(Mat)) illegal row index");
00097 
00098     if (diagNum == 0)
00099         return(TMSubVec(Min(m.Rows(), m.Cols()), m.Cols() + 1, m.Ref()));
00100     else if (diagNum < 0)
00101         return(TMSubVec(Min(m.Rows() + diagNum, m.Cols()), m.Cols() + 1,
00102             m.Ref() - diagNum * m.Cols()));
00103     else
00104         return(TMSubVec(Min(m.Cols() - diagNum, m.Rows()), m.Cols() + 1,
00105             m.Ref() + diagNum));
00106 }
00107 
00108 // --- Sub functions: SubMat ---------------------------------------------------
00109 
00110 
00111 TSubMat sub(const TSubMat &m, Int top, Int left, Int height, Int width)
00112 {
00113     Assert(left >= 0 && width > 0 && left + width <= m.Cols(),
00114         "(sub(SubMat)) illegal subset of matrix");
00115     Assert(top >= 0 && height > 0 && top + height <= m.Rows(), 
00116         "(sub(SubMat)) illegal subset of matrix");
00117 
00118     TSubMat result(height, width, m.span, m.data + top * m.span + left);
00119 
00120     return(result);
00121 }
00122 
00123 TSubMat sub(const TSubMat &m, Int nrows, Int ncols)
00124 {
00125     Assert(ncols > 0 && nrows > 0 && nrows <= m.Rows() && ncols <= m.Cols(), 
00126         "(sub(SubMat)) illegal subset of matrix");
00127 
00128     TSubMat result(nrows, ncols, m.span, m.data);
00129 
00130     return(result);
00131 }
00132 
00133 TMSubVec col(const TSubMat &m, Int i)
00134 {
00135     CheckRange(i, 0, m.Cols(), "(col(SubMat)) illegal column index");
00136 
00137     return(TMSubVec(m.rows, m.span, m.data + i));
00138 }
00139 
00140 TMSubVec row(const TSubMat &m, Int i)
00141 {
00142     CheckRange(i, 0, m.Rows(), "(row(SubMat)) illegal row index");
00143 
00144     return(TMSubVec(m.cols, 1, m.data + i * m.span));
00145 }
00146 
00147 TMSubVec diag(const TSubMat &m, Int diagNum)
00148 {
00149     CheckRange(diagNum, 1 - m.Rows(), m.Cols(), "(row(Mat)) illegal row index");
00150 
00151     if (diagNum == 0)
00152         return(TMSubVec(Min(m.rows, m.cols), m.span + 1, m.data));
00153     else if (diagNum < 0)
00154         return(TMSubVec(Min(m.rows + diagNum, m.cols), m.span + 1,
00155             m.data - diagNum * m.span));
00156     else
00157         return(TMSubVec(Min(m.cols - diagNum, m.rows), m.span + 1,
00158             m.data + diagNum));
00159 }

Generated at Sat Aug 5 00:16:48 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000