kmeans
k-means clustering in C++
Loading...
Searching...
No Matches
SimpleMatrix.hpp
Go to the documentation of this file.
1#ifndef KMEANS_SIMPLE_MATRIX_HPP
2#define KMEANS_SIMPLE_MATRIX_HPP
3
4#include <cstddef>
5
6#include "sanisizer/sanisizer.hpp"
7
8#include "Matrix.hpp"
9
15namespace kmeans {
16
20template<typename Index_, typename Data_>
21class SimpleMatrix;
22
23template<typename Index_, typename Data_>
24class SimpleMatrixRandomAccessExtractor final : public RandomAccessExtractor<Index_, Data_> {
25public:
26 SimpleMatrixRandomAccessExtractor(const SimpleMatrix<Index_, Data_>& parent) : my_parent(parent) {}
27
28private:
29 const SimpleMatrix<Index_, Data_>& my_parent;
30
31public:
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);
34 }
35};
36
37template<typename Index_, typename Data_>
38class SimpleMatrixConsecutiveAccessExtractor final : public ConsecutiveAccessExtractor<Index_, Data_> {
39public:
40 SimpleMatrixConsecutiveAccessExtractor(const SimpleMatrix<Index_, Data_>& parent, const Index_ start) : my_parent(parent), my_position(start) {}
41
42private:
43 const SimpleMatrix<Index_, Data_>& my_parent;
44 Index_ my_position;
45
46public:
47 const Data_* get_observation() {
48 return my_parent.my_data + sanisizer::product_unsafe<std::size_t>(my_position++, my_parent.my_num_dim);
49 }
50};
51
52template<typename Index_, typename Data_>
53class SimpleMatrixIndexedAccessExtractor final : public IndexedAccessExtractor<Index_, Data_> {
54public:
55 SimpleMatrixIndexedAccessExtractor(const SimpleMatrix<Index_, Data_>& parent, const Index_* const sequence) : my_parent(parent), my_sequence(sequence) {}
56
57private:
58 const SimpleMatrix<Index_, Data_>& my_parent;
59 const Index_* my_sequence;
60 std::size_t my_position = 0;
61
62public:
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);
65 }
66};
79template<typename Index_, typename Data_>
80class SimpleMatrix final : public Matrix<Index_, Data_> {
81public:
88 SimpleMatrix(const std::size_t num_dimensions, const Index_ num_observations, const Data_* const data) :
89 my_num_dim(num_dimensions), my_num_obs(num_observations), my_data(data) {}
90
91private:
92 std::size_t my_num_dim;
93 Index_ my_num_obs;
94 const Data_* my_data;
95 friend class SimpleMatrixRandomAccessExtractor<Index_, Data_>;
96 friend class SimpleMatrixConsecutiveAccessExtractor<Index_, Data_>;
97 friend class SimpleMatrixIndexedAccessExtractor<Index_, Data_>;
98
99public:
103 Index_ num_observations() const {
104 return my_num_obs;
105 }
106
107 std::size_t num_dimensions() const {
108 return my_num_dim;
109 }
110
111public:
112 std::unique_ptr<RandomAccessExtractor<Index_, Data_> > new_extractor() const {
113 return std::make_unique<SimpleMatrixRandomAccessExtractor<Index_, Data_> >(*this);
114 }
115
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);
118 }
119
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);
122 }
126};
127
128}
129
130#endif
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