Program Listing for File Vector.cpp

Return to documentation for file (src/LouLib/Math/Vector.cpp)

#include "Vector.hpp"
#include <utility>

namespace LouLib {
    namespace Math {

        Vector::Vector(int n){
            data.resize(n, 0);
        }

        Vector::Vector(std::initializer_list<double> vectorData) : data(vectorData) {}

        Vector::Vector(std::vector<double> vectorData) : data(std::move(vectorData)) {}

        Vector::Vector(const Vector& other) : data(other.data) {}

        double& Vector::operator[](int i) {
            if(i < 0 || i >= data.size()){
                throw std::invalid_argument("Index out of bounds");
            }
            return data[i];
        }

        const double& Vector::operator[](int i) const {
            if(i < 0 || i >= data.size()){
                throw std::invalid_argument("Index out of bounds");
            }
            return data[i];
        }

        int Vector::size() const {
            return (int) data.size();
        }

        double Vector::norm() {
            double sol = 0;
            for(int i = 0; i < size(); i++){
                sol += data[i] * data[i];
            }
            return std::sqrt(sol);
        }

        Vector Vector::normalize() {
            Vector result(size());
            double mag = norm();
            for(int i = 0; i < size(); i++){
                result[i] = data[i] / mag;
            }
            return result;
        }

        std::string Vector::toString() {
            std::string sol = "{";
            for(int i = 0; i < data.size(); i++){
                sol += std::to_string(data[i]);
                if(i != data.size()-1) sol += ", ";
            }
            sol += "}";
            return sol;
        }

        Vector operator+(const Vector &a, const Vector &b) {
            if(a.size() != b.size()){
                throw std::invalid_argument("Vectors must have the same size.");
            }
            Vector result(a.size());
            for (int i = 0; i < a.size(); i++) {
                result[i] = a[i] + b[i];
            }
            return result;
        }

        Vector operator-(const Vector &a, const Vector &b) {
            if(a.size() != b.size()){
                throw std::invalid_argument("Vectors must have the same size.");
            }
            Vector result(a.size());
            for (int i = 0; i < a.size(); i++) {
                result[i] = a[i] - b[i];
            }
            return result;
        }

        double operator*(const Vector &a, const Vector &b) {
            if(a.size() != b.size()){
                throw std::invalid_argument("Vectors must have the same size.");
            }
            double result = 0;
            for(int i = 0; i < a.size(); i++){
                result += a[i] * b[i];
            }
            return result;
        }

        Vector operator*(const double &a, const Vector &b) {
            Vector result(b.size());
            for(int i = 0; i < b.size(); i++){
                result[i] = b[i] * a;
            }
            return result;
        }

        Vector operator*(const Vector &a, const double &b) {
            Vector result(a.size());
            for(int i = 0; i < a.size(); i++){
                result[i] = a[i] * b;
            }
            return result;
        }

    } // Math
} // LouLib