32 #ifndef SHARK_LINALG_METRICS_H 33 #define SHARK_LINALG_METRICS_H 37 namespace shark{
namespace blas{
48 template<
class VectorT,
class WeightT>
64 template<
class VectorT,
class WeightT>
84 template<
class VectorT,
class VectorU,
class WeightT>
88 WeightT
const& weights,
89 sparse_bidirectional_iterator_tag,
90 sparse_bidirectional_iterator_tag
93 typename VectorT::value_type
sum=0;
94 typename VectorT::const_iterator iter1=op1.begin();
95 typename VectorU::const_iterator iter2=op2.begin();
96 typename VectorT::const_iterator end1=op1.end();
97 typename VectorU::const_iterator end2=op2.end();
99 while(iter1 != end1 && iter2 != end2)
101 std::size_t index1=iter1.index();
102 std::size_t index2=iter2.index();
104 sum += weights(index1) *
sqr(*iter1-*iter2);
108 else if(index1<index2){
109 sum += weights(index1) *
sqr(*iter1);
113 sum += weights(index2) *
sqr(*iter2);
119 std::size_t index1=iter1.index();
120 sum += weights(index1) *
sqr(*iter1);
125 std::size_t index2=iter2.index();
126 sum += weights(index2) *
sqr(*iter2);
136 template<
class VectorT,
class VectorU,
class WeightT>
140 WeightT
const& weights,
141 sparse_bidirectional_iterator_tag,
142 dense_random_access_iterator_tag
145 typename VectorT::const_iterator iter=op1.begin();
146 typename VectorT::const_iterator end=op1.end();
148 std::size_t index = 0;
150 typename VectorT::value_type
sum=0;
152 for(;iter != end;++iter,++pos){
153 index = iter.index();
154 for(;pos != index;++pos){
155 sum += weights(pos) *
sqr(op2(pos));
157 sum += weights(index) *
sqr(*iter-op2(pos));
159 for(;pos != op2.size();++pos){
160 sum += weights(pos) *
sqr(op2(pos));
164 template<
class VectorT,
class VectorU,
class WeightT>
168 WeightT
const& weights,
169 dense_random_access_iterator_tag arg1tag,
170 sparse_bidirectional_iterator_tag arg2tag
175 template<
class VectorT,
class VectorU,
class WeightT>
179 WeightT
const& weights,
180 dense_random_access_iterator_tag,
181 dense_random_access_iterator_tag
187 template<
class MatrixT,
class VectorU,
class Result>
188 void distanceSqrBlockVector(
189 MatrixT
const& operands,
193 typedef typename Result::value_type value_type;
195 for(std::size_t i = 0; i != operands.size1(); ++i){
197 row(operands,i),op2,one,
198 typename major_iterator<MatrixT>::type::iterator_category(),
199 typename VectorU::iterator::iterator_category()
205 template<
class MatrixX,
class MatrixY,
class Result>
206 void distanceSqrBlockBlockRowWise(
211 std::size_t sizeX=X.size1();
212 std::size_t sizeY=Y.size1();
214 for(std::size_t i = 0; i != sizeX; ++i){
216 distanceSqrBlockVector(
217 Y,
row(X,i),distanceRow
221 for(std::size_t i = 0; i != sizeY; ++i){
223 distanceSqrBlockVector(
224 X,
row(Y,i),distanceCol
231 template<
class MatrixX,
class MatrixY,
class Result>
232 void distanceSqrBlockBlock(
236 dense_random_access_iterator_tag,
237 dense_random_access_iterator_tag
239 typedef typename Result::value_type value_type;
240 std::size_t sizeX=X.size1();
241 std::size_t sizeY=Y.size1();
242 ensure_size(distances,X.size1(),Y.size1());
243 if(sizeX < 10 || sizeY<10){
244 distanceSqrBlockBlockRowWise(X,Y,distances);
252 for(std::size_t i = 0; i != sizeY; ++i){
256 for(std::size_t i = 0; i != sizeX; ++i){
262 template<
class MatrixX,
class MatrixY,
class Result>
263 void distanceSqrBlockBlock(
267 sparse_bidirectional_iterator_tag,
268 sparse_bidirectional_iterator_tag
270 distanceSqrBlockBlockRowWise(X,Y,distances);
286 template<
class VectorT,
class VectorU,
class WeightT>
296 op1(), op2(), weights(),
297 typename VectorT::iterator::iterator_category(),
298 typename VectorU::iterator::iterator_category()
305 template<
class VectorT,
class VectorU>
311 typedef typename VectorT::value_type value_type;
322 template<
class MatrixT,
class VectorU,
class VectorR>
329 ensure_size(distances,operands().size1());
330 detail::distanceSqrBlockVector(
331 operands(),op2(),distances()
341 template<
class MatrixT,
class VectorU>
358 template<
class MatrixT,
class VectorU>
378 template<
class MatrixT,
class MatrixU>
385 std::size_t sizeX=X().size1();
386 std::size_t sizeY=Y().size1();
387 Matrix distances(sizeX, sizeY);
388 detail::distanceSqrBlockBlock(
390 typename major_iterator<MatrixT>::type::iterator_category(),
391 typename major_iterator<MatrixU>::type::iterator_category()
401 template<
class VectorT,
class VectorU>
417 template<
class VectorT,
class VectorU,
class WeightT>