|
|
|
#pragma once
|
|
|
|
#include "cnumber.hpp"
|
|
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
class vector {
|
|
|
|
private:
|
|
|
|
long long dimention;
|
|
|
|
cnumber *entries;
|
|
|
|
|
|
|
|
public:
|
|
|
|
vector(const long long dimention) {
|
|
|
|
this->dimention = dimention;
|
|
|
|
this->entries = (cnumber *)calloc(sizeof(cnumber), dimention);
|
|
|
|
for (long long i = 0; i < dimention; i++) {
|
|
|
|
this->set_entry(i, cnumber(0, 0));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
vector(const vector &v) {
|
|
|
|
this->dimention = v.get_dimention();
|
|
|
|
this->entries = (cnumber *)calloc(sizeof(cnumber), v.get_dimention());
|
|
|
|
for (long long i = 0; i < v.get_dimention(); i++) {
|
|
|
|
this->set_entry(i, v.get_entry(i));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
~vector() {
|
|
|
|
this->dimention = 0;
|
|
|
|
free(this->entries);
|
|
|
|
this->entries = NULL;
|
|
|
|
}
|
|
|
|
long long get_dimention() const { return this->dimention; }
|
|
|
|
cnumber *get_entries() const { return this->entries; }
|
|
|
|
cnumber get_entry(const long long index) const {
|
|
|
|
if (index < this->get_dimention()) {
|
|
|
|
return this->entries[index];
|
|
|
|
}
|
|
|
|
return cnumber(0,0);
|
|
|
|
}
|
|
|
|
void set_entry(const long long index, const cnumber z) {
|
|
|
|
if (index < this->get_dimention()) {
|
|
|
|
this->entries[index] = z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const cnumber operator[](const long long index) const {
|
|
|
|
return this->get_entry(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
// FIXME: Figure out how to make sure you do not try to access something outside of the index
|
|
|
|
cnumber &operator[](const long long index) { return this->entries[index]; }
|
|
|
|
|
|
|
|
friend ostream &operator<<(ostream &os, const vector &v) {
|
|
|
|
for (long long i = 0; i < v.get_dimention(); i++) {
|
|
|
|
os << "| " << v[i] << " |";
|
|
|
|
if (i != v.get_dimention() - 1)
|
|
|
|
os << endl;
|
|
|
|
}
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
void operator=(const vector &v) {
|
|
|
|
this->dimention = v.get_dimention();
|
|
|
|
free(this->entries);
|
|
|
|
this->entries = (cnumber *)calloc(sizeof(cnumber), dimention);
|
|
|
|
for (long long i = 0; i < v.get_dimention(); i++) {
|
|
|
|
this->set_entry(i, v.get_entry(i));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const vector operator+(const vector &v) const {
|
|
|
|
if (this->get_dimention() != v.get_dimention()) {
|
|
|
|
return vector(0);
|
|
|
|
}
|
|
|
|
vector sum = vector(v.get_dimention());
|
|
|
|
for (long long i = 0; i < v.get_dimention(); i++) {
|
|
|
|
sum[i] = this->get_entry(i) + v[i];
|
|
|
|
}
|
|
|
|
return sum;
|
|
|
|
}
|
|
|
|
|
|
|
|
const vector operator-(const vector &v) const {
|
|
|
|
if (this->get_dimention() != v.get_dimention()) {
|
|
|
|
return vector(0);
|
|
|
|
}
|
|
|
|
vector sum = vector(v.get_dimention());
|
|
|
|
for (long long i = 0; i < v.get_dimention(); i++) {
|
|
|
|
sum[i] = this->entries[i] - v[i];
|
|
|
|
}
|
|
|
|
return sum;
|
|
|
|
}
|
|
|
|
const vector operator*(const cnumber scalar) const {
|
|
|
|
vector product = vector(this->get_dimention());
|
|
|
|
for (long long i = 0; i < this->get_dimention(); i++) {
|
|
|
|
product[i] = this->entries[i] * scalar;
|
|
|
|
}
|
|
|
|
return product;
|
|
|
|
}
|
|
|
|
const cnumber operator*(const vector &v) const {
|
|
|
|
cnumber res(0,0);
|
|
|
|
for (long long i = 0; i < this->get_dimention(); i++) {
|
|
|
|
res = res + this->get_entry(i) * v.get_entry(i);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
};
|