knncolle
Collection of KNN methods in C++
Loading...
Searching...
No Matches
Matrix.hpp
Go to the documentation of this file.
1#ifndef KNNCOLLE_MATRIX_HPP
2#define KNNCOLLE_MATRIX_HPP
3
4#include <memory>
5#include <cstddef>
6
12namespace knncolle {
13
19template<typename Data_>
21public:
25 MatrixExtractor() = default;
26 MatrixExtractor(const MatrixExtractor&) = default;
28 MatrixExtractor& operator=(const MatrixExtractor&) = default;
29 MatrixExtractor& operator=(MatrixExtractor&&) = default;
30 virtual ~MatrixExtractor() = default;
35public:
43 virtual const Data_* next() = 0;
44};
45
46
55template<typename Index_, typename Data_>
56class Matrix {
57public:
61 Matrix() = default;
62 Matrix(const Matrix&) = default;
63 Matrix(Matrix&&) = default;
64 Matrix& operator=(const Matrix&) = default;
65 Matrix& operator=(Matrix&&) = default;
66 virtual ~Matrix() = default;
71public:
75 virtual Index_ num_observations() const = 0;
76
80 virtual std::size_t num_dimensions() const = 0;
81
82public:
86 virtual std::unique_ptr<MatrixExtractor<Data_> > new_extractor() const = 0;
87};
88
96template<typename Data_>
97class SimpleMatrixExtractor final : public MatrixExtractor<Data_> {
98public:
102 SimpleMatrixExtractor(const Data_* data, std::size_t dim) : my_data(data), my_dim(dim) {}
107private:
108 const Data_* my_data;
109 std::size_t my_dim;
110 std::size_t at = 0;
111
112public:
113 const Data_* next() {
114 return my_data + (at++) * my_dim; // already std::size_t's to avoid overflow during multiplication.
115 }
116};
117
127template<typename Index_, typename Data_>
128class SimpleMatrix final : public Matrix<Index_, Data_> {
129public:
136 SimpleMatrix(std::size_t num_dimensions, Index_ num_observations, const Data_* data) :
137 my_num_dim(num_dimensions), my_num_obs(num_observations), my_data(data) {}
138
139private:
140 std::size_t my_num_dim;
141 Index_ my_num_obs;
142 const Data_* my_data;
143
144public:
145 Index_ num_observations() const {
146 return my_num_obs;
147 }
148
149 std::size_t num_dimensions() const {
150 return my_num_dim;
151 }
152
153 std::unique_ptr<MatrixExtractor<Data_> > new_extractor() const {
154 return std::make_unique<SimpleMatrixExtractor<Data_> >(my_data, my_num_dim);
155 }
156};
157
158}
159
160#endif
Extractor interface for matrix data.
Definition Matrix.hpp:20
virtual const Data_ * next()=0
Interface for matrix data.
Definition Matrix.hpp:56
virtual std::size_t num_dimensions() const =0
virtual std::unique_ptr< MatrixExtractor< Data_ > > new_extractor() const =0
virtual Index_ num_observations() const =0
Extractor for a SimpleMatrix.
Definition Matrix.hpp:97
const Data_ * next()
Definition Matrix.hpp:113
Simple wrapper for an in-memory matrix.
Definition Matrix.hpp:128
std::size_t num_dimensions() const
Definition Matrix.hpp:149
std::unique_ptr< MatrixExtractor< Data_ > > new_extractor() const
Definition Matrix.hpp:153
Index_ num_observations() const
Definition Matrix.hpp:145
SimpleMatrix(std::size_t num_dimensions, Index_ num_observations, const Data_ *data)
Definition Matrix.hpp:136
Collection of KNN algorithms.
Definition Bruteforce.hpp:24