From 8ac4d298a209a2b381f203c2b63e59ace9736846 Mon Sep 17 00:00:00 2001 From: y-jan137 Date: Thu, 12 Mar 2026 15:01:35 +0300 Subject: Add matrix, vector classes and tests --- src/vector.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/vector.cpp (limited to 'src/vector.cpp') diff --git a/src/vector.cpp b/src/vector.cpp new file mode 100644 index 0000000..b8b1c6f --- /dev/null +++ b/src/vector.cpp @@ -0,0 +1,92 @@ +#include "vector.hpp" +#include "linalg_error.hpp" + +#include +#include +#include +#include + +namespace linalg { + +namespace { + +void check_same_size(const Vector& lhs, const Vector& rhs, const char* operation) { + if (lhs.size() != rhs.size()) { + std::ostringstream oss; + oss << operation << " requires equal vector sizes, got " << lhs.size() << " and " + << rhs.size(); + throw DimensionMismatchError(oss.str()); + } +} + +} // namespace + +Vector::Vector(std::size_t n) : data_(n) {} + +Vector::Vector(std::size_t n, double value) : data_(n, value) {} + +Vector::Vector(std::initializer_list values) : data_(values) {} + +std::size_t Vector::size() const noexcept { return data_.size(); } + +bool Vector::empty() const noexcept { return data_.empty(); } + +double& Vector::operator[](std::size_t i) { + check_index(i); + return data_[i]; +} + +const double& Vector::operator[](std::size_t i) const { + check_index(i); + return data_[i]; +} + +void Vector::fill(double value) { std::fill(data_.begin(), data_.end(), value); } + +double* Vector::data() noexcept { return data_.data(); } + +const double* Vector::data() const noexcept { return data_.data(); } + +void Vector::check_index(std::size_t i) const { + if (i >= data_.size()) { + throw std::out_of_range("Vector index out of range"); + } +} + +Vector operator+(const Vector& lhs, const Vector& rhs) { + check_same_size(lhs, rhs, "Vector addition"); + + Vector result(lhs.size()); + for (std::size_t i = 0; i < lhs.size(); ++i) { + result[i] = lhs[i] + rhs[i]; + } + return result; +} + +Vector operator-(const Vector& lhs, const Vector& rhs) { + check_same_size(lhs, rhs, "Vector subtraction"); + + Vector result(lhs.size()); + for (std::size_t i = 0; i < lhs.size(); ++i) { + result[i] = lhs[i] - rhs[i]; + } + return result; +} + +Vector operator*(const Vector& v, double scalar) { + Vector result(v.size()); + for (std::size_t i = 0; i < v.size(); ++i) { + result[i] = v[i] * scalar; + } + return result; +} + +Vector operator*(double scalar, const Vector& v) { return v * scalar; } + +double dot(const Vector& lhs, const Vector& rhs) { + check_same_size(lhs, rhs, "Dot product"); + + return std::inner_product(lhs.begin(), lhs.end(), rhs.begin(), 0.0); +} + +} // namespace linalg -- cgit v1.2.3