| 2537 | } |
| 2538 | |
| 2539 | class KMeansPPDistanceComputer : public ParallelLoopBody |
| 2540 | { |
| 2541 | public: |
| 2542 | KMeansPPDistanceComputer( float *_tdist2, |
| 2543 | const float *_data, |
| 2544 | const float *_dist, |
| 2545 | int _dims, |
| 2546 | size_t _step, |
| 2547 | size_t _stepci ) |
| 2548 | : tdist2(_tdist2), |
| 2549 | data(_data), |
| 2550 | dist(_dist), |
| 2551 | dims(_dims), |
| 2552 | step(_step), |
| 2553 | stepci(_stepci) { } |
| 2554 | |
| 2555 | void operator()( const cv::Range& range ) const |
| 2556 | { |
| 2557 | const int begin = range.start; |
| 2558 | const int end = range.end; |
| 2559 | |
| 2560 | for ( int i = begin; i<end; i++ ) |
| 2561 | { |
| 2562 | tdist2[i] = std::min(normL2Sqr_(data + step*i, data + stepci, dims), dist[i]); |
| 2563 | } |
| 2564 | } |
| 2565 | |
| 2566 | private: |
| 2567 | KMeansPPDistanceComputer& operator=(const KMeansPPDistanceComputer&); // to quiet MSVC |
| 2568 | |
| 2569 | float *tdist2; |
| 2570 | const float *data; |
| 2571 | const float *dist; |
| 2572 | const int dims; |
| 2573 | const size_t step; |
| 2574 | const size_t stepci; |
| 2575 | }; |
| 2576 | |
| 2577 | /* |
| 2578 | k-means center initialization using the following algorithm: |