ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkVariableSizeMatrix_h 00019 #define __itkVariableSizeMatrix_h 00020 00021 #include "itkPoint.h" 00022 #include "itkCovariantVector.h" 00023 #include "vnl/vnl_matrix_fixed.h" 00024 #include "vnl/algo/vnl_matrix_inverse.h" 00025 #include "vnl/vnl_transpose.h" 00026 #include "vnl/vnl_matrix.h" 00027 #include "itkArray.h" 00028 00029 namespace itk 00030 { 00042 template< class T > 00043 class VariableSizeMatrix 00044 { 00045 public: 00047 typedef VariableSizeMatrix Self; 00048 00050 typedef T ValueType; 00051 typedef T ComponentType; 00052 00054 typedef vnl_matrix< T > InternalMatrixType; 00055 00057 Array< T > operator *(const Array< T > & vector) const; 00058 00060 Self operator *(const Self & matrix) const; 00061 00063 Self operator+(const Self & matrix) const; 00064 00065 const Self & operator+=(const Self & matrix); 00066 00068 Self operator-(const Self & matrix) const; 00069 00070 const Self & operator-=(const Self & matrix); 00071 00073 Self & operator-(); 00074 00076 vnl_matrix< T > operator *(const vnl_matrix< T > & matrix) const; 00077 00079 void operator*=(const Self & matrix); 00080 00082 void operator*=(const vnl_matrix< T > & matrix); 00083 00085 vnl_vector< T > operator *(const vnl_vector< T > & matrix) const; 00086 00088 void operator*=(const T & value) { m_Matrix *= value; } 00089 00091 Self operator*(const T & value) 00092 { 00093 Self result(*this); 00094 00095 result *= value; 00096 return result; 00097 } 00098 00100 void operator/=(const T & value) { m_Matrix /= value; } 00101 00103 Self operator/(const T & value) 00104 { 00105 Self result(*this); 00106 00107 result /= value; 00108 return result; 00109 } 00110 00112 inline T & operator()(unsigned int row, unsigned int col) 00113 { 00114 return m_Matrix(row, col); 00115 } 00116 00118 inline const T & operator()(unsigned int row, unsigned int col) const 00119 { 00120 return m_Matrix(row, col); 00121 } 00122 00124 inline T * operator[](unsigned int i) 00125 { 00126 return m_Matrix[i]; 00127 } 00128 00130 inline const T * operator[](unsigned int i) const 00131 { 00132 return m_Matrix[i]; 00133 } 00134 00136 inline InternalMatrixType & GetVnlMatrix(void) 00137 { 00138 return m_Matrix; 00139 } 00140 00142 inline const InternalMatrixType & GetVnlMatrix(void) const 00143 { 00144 return m_Matrix; 00145 } 00146 00148 inline void SetIdentity(void) 00149 { 00150 m_Matrix.set_identity(); 00151 } 00152 00154 inline void Fill(const T & value) 00155 { 00156 m_Matrix.fill(value); 00157 } 00158 00160 inline const Self & operator=(const vnl_matrix< T > & matrix) 00161 { 00162 m_Matrix = matrix; 00163 return *this; 00164 } 00165 00167 inline bool operator==(const Self & matrix) const; 00168 00169 inline bool operator!=(const Self & matrix) const 00170 { 00171 return !this->operator==(matrix); 00172 } 00173 00175 inline const Self & operator=(const Self & matrix) 00176 { 00177 m_Matrix = matrix.m_Matrix; 00178 return *this; 00179 } 00180 00182 inline vnl_matrix< T > GetInverse(void) const 00183 { 00184 vnl_matrix< T > temp = vnl_matrix_inverse< T >(m_Matrix); 00185 return temp; 00186 } 00188 00190 inline vnl_matrix< T > GetTranspose(void) const 00191 { 00192 return m_Matrix.transpose(); 00193 } 00194 00196 VariableSizeMatrix():m_Matrix() {} 00197 00198 VariableSizeMatrix(unsigned int rows, unsigned int cols); 00199 00201 VariableSizeMatrix(const Self & matrix):m_Matrix(matrix.m_Matrix) {} 00202 00204 inline unsigned int Rows() const { return m_Matrix.rows(); } 00205 00207 inline unsigned int Cols() const { return m_Matrix.cols(); } 00208 00210 inline bool SetSize(unsigned int r, unsigned int c) { return m_Matrix.set_size(r, c); } 00211 private: 00212 InternalMatrixType m_Matrix; 00213 }; 00214 00215 template< class T > 00216 ITK_EXPORT std::ostream & operator<<(std::ostream & os, 00217 const VariableSizeMatrix< T > & v) 00218 { 00219 os << v.GetVnlMatrix(); return os; 00220 } 00221 00225 template< class T > 00226 inline 00227 bool 00228 VariableSizeMatrix< T > 00229 ::operator==(const Self & matrix) const 00230 { 00231 if ( ( matrix.Rows() != this->Rows() ) 00232 || ( matrix.Cols() != this->Cols() ) ) 00233 { 00234 return false; 00235 } 00236 bool equal = true; 00238 00239 for ( unsigned int r = 0; r < this->Rows(); r++ ) 00240 { 00241 for ( unsigned int c = 0; c < this->Cols(); c++ ) 00242 { 00243 if ( m_Matrix(r, c) != matrix.m_Matrix(r, c) ) 00244 { 00245 equal = false; 00246 break; 00247 } 00248 } 00249 } 00250 return equal; 00251 } 00252 } // end namespace itk 00253 00254 #ifndef ITK_MANUAL_INSTANTIATION 00255 #include "itkVariableSizeMatrix.hxx" 00256 #endif 00257 00258 #endif 00259