1#ifndef KMEANS_SIMPLE_MATRIX_HPP
2#define KMEANS_SIMPLE_MATRIX_HPP
6#include "sanisizer/sanisizer.hpp"
20template<
typename Index_,
typename Data_>
23template<
typename Index_,
typename Data_>
24class SimpleMatrixRandomAccessExtractor final :
public RandomAccessExtractor<Index_, Data_> {
26 SimpleMatrixRandomAccessExtractor(
const SimpleMatrix<Index_, Data_>& parent) : my_parent(parent) {}
29 const SimpleMatrix<Index_, Data_>& my_parent;
32 const Data_* get_observation(
const Index_ i) {
33 return my_parent.my_data + sanisizer::product_unsafe<std::size_t>(i, my_parent.my_num_dim);
37template<
typename Index_,
typename Data_>
38class SimpleMatrixConsecutiveAccessExtractor final :
public ConsecutiveAccessExtractor<Index_, Data_> {
40 SimpleMatrixConsecutiveAccessExtractor(
const SimpleMatrix<Index_, Data_>& parent,
const Index_ start) : my_parent(parent), my_position(start) {}
43 const SimpleMatrix<Index_, Data_>& my_parent;
47 const Data_* get_observation() {
48 return my_parent.my_data + sanisizer::product_unsafe<std::size_t>(my_position++, my_parent.my_num_dim);
52template<
typename Index_,
typename Data_>
53class SimpleMatrixIndexedAccessExtractor final :
public IndexedAccessExtractor<Index_, Data_> {
55 SimpleMatrixIndexedAccessExtractor(
const SimpleMatrix<Index_, Data_>& parent,
const Index_*
const sequence) : my_parent(parent), my_sequence(sequence) {}
58 const SimpleMatrix<Index_, Data_>& my_parent;
59 const Index_* my_sequence;
60 std::size_t my_position = 0;
63 const Data_* get_observation() {
64 return my_parent.my_data + sanisizer::product_unsafe<std::size_t>(my_sequence[my_position++], my_parent.my_num_dim);
79template<
typename Index_,
typename Data_>
92 std::size_t my_num_dim;
95 friend class SimpleMatrixRandomAccessExtractor<Index_, Data_>;
96 friend class SimpleMatrixConsecutiveAccessExtractor<Index_, Data_>;
97 friend class SimpleMatrixIndexedAccessExtractor<Index_, Data_>;
112 std::unique_ptr<RandomAccessExtractor<Index_, Data_> >
new_extractor()
const {
113 return std::make_unique<SimpleMatrixRandomAccessExtractor<Index_, Data_> >(*this);
116 std::unique_ptr<ConsecutiveAccessExtractor<Index_, Data_> >
new_extractor(
const Index_ start,
const Index_)
const {
117 return std::make_unique<SimpleMatrixConsecutiveAccessExtractor<Index_, Data_> >(*
this, start);
120 std::unique_ptr<IndexedAccessExtractor<Index_, Data_> >
new_extractor(
const Index_* sequence,
const std::size_t)
const {
121 return std::make_unique<SimpleMatrixIndexedAccessExtractor<Index_, Data_> >(*
this, sequence);
Interface for matrix inputs.
Interface for matrix data.
Definition Matrix.hpp:133
virtual std::size_t num_dimensions() const =0
virtual std::unique_ptr< RandomAccessExtractor< Index_, Data_ > > new_extractor() const =0
virtual Index_ num_observations() const =0
A simple matrix of observations.
Definition SimpleMatrix.hpp:80
SimpleMatrix(const std::size_t num_dimensions, const Index_ num_observations, const Data_ *const data)
Definition SimpleMatrix.hpp:88
Perform k-means clustering.
Definition compute_wcss.hpp:16