33 bool isValidLHS(
const bclib::matrix<int> & result);
39 bool isValidLHS(
const bclib::matrix<double> & result);
48 void rank(
const std::vector<T> & toRank, std::vector<int> & ranks)
50 if (toRank.size() != ranks.size())
52 ranks.resize(toRank.size(), 0);
54 typename std::vector<T>::const_iterator toRank_it1;
55 typename std::vector<T>::const_iterator toRank_it2;
56 std::vector<int>::iterator ranks_it;
57 for (toRank_it1 = toRank.begin(), ranks_it = ranks.begin();
58 toRank_it1 != toRank.end() && ranks_it != ranks.end();
59 ++toRank_it1, ++ranks_it)
62 for (toRank_it2 = toRank.begin(); toRank_it2 != toRank.end(); ++toRank_it2)
64 if (*toRank_it1 < *toRank_it2)
115 return (x-y) * (x-y);
129 if (A.size() != B.size())
131 throw std::runtime_error(
"Inputs of a different size");
134 T sum = std::inner_product(A.begin(), A.end(), B.begin(),
static_cast<T
>(0), std::plus<T>(),
squareDifference<T>());
151 template <
class T,
bool ISROWWISE>
153 const typename bclib::matrixConstIter<T,ISROWWISE> Aend,
154 const typename bclib::matrixConstIter<T,ISROWWISE> Bbegin)
157 T sum = std::inner_product(Abegin, Aend, Bbegin,
static_cast<T
>(0), std::plus<T>(),
squareDifference<T>());
171 if (result.rowsize() != m_rows || result.colsize() != m_rows)
173 result = bclib::matrix<double>(m_rows, m_rows);
179 typename bclib::matrix<T>::const_rowwise_iterator rowi_begin = mat.rowwisebegin(i);
180 typename bclib::matrix<T>::const_rowwise_iterator rowi_end = mat.rowwiseend(i);
181 typename bclib::matrix<T>::const_rowwise_iterator rowj_begin = mat.rowwisebegin(j);
182 T sum = calculateDistanceSquared<T, true>(rowi_begin, rowi_end, rowj_begin);
183 result(i,j) = sqrt(
static_cast<double>(sum));
193 template <
class T,
class W>
194 struct invert :
public std::unary_function<T, W>
203 if (x !=
static_cast<T
>(0))
205 return 1.0 /
static_cast<W
>(x);
209 return static_cast<W
>(x);
224 bclib::matrix<double> dist = bclib::matrix<double>(A.rowsize(), A.rowsize());
226 calculateDistance<T>(A, dist);
228 std::transform<bclib::matrix<double>::iterator>(dist.begin(), dist.end(),
231 double totalInvDistance = std::accumulate<bclib::matrix<double>::iterator>(dist.begin(), dist.end(), 0.0);
232 return totalInvDistance;
248 double totalInvDistance = 0.0;
250 for (
msize_type irow = 0; irow < nr - 1; irow++)
253 for (
msize_type jrow = (irow + 1); jrow < nr; jrow++)
255 oneDistance =
static_cast<T
>(0);
261 diff = A(irow,kcol) - A(jrow,kcol);
262 oneDistance += diff * diff;
265 if (oneDistance != 0)
267 totalInvDistance += (1.0 / sqrt(
static_cast<double>(oneDistance)));
271 return totalInvDistance;
281 void copyMatrix(bclib::matrix<T> & copyTo,
const bclib::matrix<T> & copyFrom)
283 if (copyFrom.rowsize() != copyTo.rowsize() ||
284 copyFrom.colsize() != copyTo.colsize() ||
285 copyFrom.isTransposed() != copyTo.isTransposed())
287 throw std::runtime_error(
"Matrices are not compatible for a copy");
289 std::copy<typename bclib::matrix<T>::const_iterator,
typename bclib::matrix<T>::iterator>(copyFrom.begin(), copyFrom.end(), copyTo.begin());
302 double sum = sumInvDistance<T>(mat);
326 if (output.size() != n)
330 std::vector<double> r = std::vector<double>(n);
332 typename std::vector<T1>::iterator output_it;
333 std::vector<double>::iterator r_it;
334 double range =
static_cast<double>(max) + 1.0 -
static_cast<double>(min);
335 for (output_it = output.begin(), r_it = r.begin();
336 output_it != output.end() && r_it != r.end(); ++output_it, ++r_it)
338 *output_it = min +
static_cast<T1
>(floor((*r_it) * range));
354 double range =
static_cast<double>(max) + 1.0 -
static_cast<double>(min);
355 *output = min +
static_cast<T1
>(floor((r * range)));