[ VIGRA Homepage | Function Index | Class Index | Namespaces | File List | Main Page ]
vigra/random_forest/splices.hxx | ![]() |
00001 #ifndef SPLICES_HXX 00002 #define SPLICES_HXX 00003 #include <vigra/multi_array.hxx> 00004 #include <iterator> 00005 00006 namespace vigra 00007 { 00008 /** Idea for a class to use for easy splicing 00009 * 00010 * usage (with factory function _spl) 00011 * 00012 * // copy every even indexed element to a 5 x 5 00013 * // sized matrix 00014 * Matrix<double> a(10, 10) 00015 * MultiArrayView<2,double> b(_spl_shp(_spl(0,2,10), 00016 * _spl(0,2,10))); 00017 * copy_splice(_spl(0,2,10),_spl(0,2,10), a, b); 00018 * 00019 * it is also possible to supply iterator ranges 00020 * std::vector<int> indices; 00021 * indices.push_back(3) (...) 00022 * 00023 * copy_splice(_spl(indices.begin(), indices.end()), 00024 * _spl(a.shape(1)), 00025 * a, b) 00026 * 00027 * if you only have a forward iterator then you must 00028 * specify the size of the splice with 00029 * _spl(set.begin(), set.end(), set.size()); 00030 * 00031 * ok.. what we actually need is a decent iota iterator 00032 * or something like xrange but for now it should suffice. 00033 */ 00034 template<class T> 00035 class Splice 00036 { 00037 int size_; 00038 T begin_; 00039 T end_; 00040 public: 00041 Splice(T &begin, T &end) 00042 : size_(std::distance(begin, end)), 00043 begin_(begin), 00044 end_(end) 00045 {} 00046 00047 int operator[](int index) 00048 { 00049 T ii = begin_; 00050 std::advance(ii, index); 00051 return *ii; 00052 } 00053 00054 int size() 00055 { 00056 return size_; 00057 } 00058 }; 00059 00060 template<> 00061 class Splice<int> 00062 { 00063 int begin_; 00064 int interval_; 00065 int end_; 00066 int size_; 00067 public: 00068 Splice(int begin, int end) 00069 : begin_(begin), 00070 interval_(1), 00071 end_(end), 00072 size_(end - begin) 00073 {} 00074 00075 Splice(int begin, int interval, int end) 00076 : begin_(begin), 00077 interval_(interval), 00078 end_(end), 00079 size_(int(std::floor((double(end) -double(begin))/interval))) 00080 {} 00081 00082 int operator[](int index) 00083 { 00084 int ii = begin_ + index * interval_; 00085 return ii; 00086 } 00087 00088 int size() 00089 { 00090 return size_; 00091 } 00092 }; 00093 00094 template<class T> 00095 Splice<T> _spl(T b, T e) 00096 { 00097 return Splice<T>(b, e); 00098 } 00099 template<class T> 00100 Splice<T> _spl(T b, int size, T e) 00101 { 00102 return Splice<T>(b, size, e); 00103 } 00104 00105 inline Splice<int> _spl(int size) 00106 { 00107 return Splice<int>(0, size); 00108 } 00109 00110 00111 00112 template<class T, class G> 00113 inline MultiArrayShape<2>::type _spl_shp(Splice<T> f, 00114 Splice<G> h) 00115 { 00116 return MultiArrayShape<2>::type(f.size(), h.size()); 00117 } 00118 00119 00120 00121 00122 template< class R, class F, 00123 class T, class C, 00124 class T2, class C2 > 00125 void copy_splice( Splice<R> _first, 00126 Splice<F> _second, 00127 MultiArrayView<2, T, C> src, 00128 MultiArrayView<2, T2, C2> dest) 00129 { 00130 for(int jj = 0 ; jj < _second.size(); ++jj) 00131 { 00132 for(int ii = 0 ; ii < _first.size(); ++ii) 00133 { 00134 dest(ii, jj) = src(_first[ii], _second[jj]); 00135 } 00136 } 00137 } 00138 00139 }; 00140 #endif //SPLICES_HXX
© Ullrich Köthe (ullrich.koethe@iwr.uni-heidelberg.de) |
html generated using doxygen and Python
|