Switch terminology and add rotation by one pi radian

main
Micke Nordin 2 years ago
parent 263834ebe5
commit 25ab7fece1
Signed by: micke
GPG Key ID: 014B273D614BE877

@ -3,7 +3,7 @@
int main() {
vector a = vector(2);
a[0] = cnumber(7, 0);
a[1] = cnumber(6, 0);
a[1] = cnumber(6, 1);
vector b = vector(2);
b[0] = cnumber(5, 0);
@ -11,12 +11,12 @@ int main() {
vector c = vector(2);
c[0] = cnumber(2, 0);
c[1] = cnumber(5, 0);
c[1] = cnumber(1, 1);
vector d = vector(2);
d[0] = cnumber(1, 0);
d[1] = cnumber(0, 1);
d[0] = cnumber(1, -1);
d[1] = cnumber(5, 0);
matrix m = matrix(2, 2);
m[0] = a;
@ -28,6 +28,8 @@ int main() {
cout << "The matrix m:" << endl;
cout << m << endl;
cout << "The matrix m roted by one pi radian:" << endl;
cout << m.rotate_by_one_pi() << endl;
cout << "The determinant of matrix m:" << endl;
cout << m.determinant() << endl;
cout << "The matrix m's transpose:" << endl;
@ -47,8 +49,8 @@ int main() {
<< endl;
cout << m.hermitian_conjugate() << endl;
}
if (!n.is_hermitian()) {
cout << "The matrix n is not hermitian, here is the hermitian conjugate:"
if (n.is_hermitian()) {
cout << "The matrix n is hermitian, here is the hermitian conjugate:"
<< endl;
cout << n.hermitian_conjugate() << endl;
}

@ -6,32 +6,36 @@
using namespace std;
class matrix {
private:
long long num_cols;
long long num_rows;
vector *cols;
long long num_entries;
long long entry_dimension;
vector *entries;
bool err;
public:
matrix(const long long num_rows, const long long num_cols) {
this->num_cols = num_cols;
this->num_rows = num_rows;
this->cols = (vector *)calloc(sizeof(vector), num_cols);
for (long long i = 0; i < num_cols; i++) {
this->cols[i] = vector(num_rows);
matrix(const long long num_entries, const long long entry_dimension) {
this->num_entries = entry_dimension;
this->entry_dimension = num_entries;
this->err = false;
this->entries = (vector *)malloc(sizeof(vector) * this->num_entries);
for (long long i = 0; i < entry_dimension; i++) {
this->entries[i] = vector(this->entry_dimension);
}
}
matrix(const matrix &m) {
this->num_cols = m.num_cols;
this->num_rows = m.num_rows;
this->cols = (vector *)calloc(sizeof(vector), m.num_cols);
for (long long i = 0; i < m.num_cols; i++) {
this->cols[i] = m[i];
this->num_entries = m.num_entries;
this->entry_dimension = m.entry_dimension;
this->err = m.err;
this->entries = (vector *)malloc(sizeof(vector) * m.num_entries);
for (long long i = 0; i < m.num_entries; i++) {
this->entries[i] = m[i];
}
}
~matrix() {
this->num_cols = 0;
this->num_rows = 0;
free(this->cols);
this->cols = NULL;
this->num_entries = 0;
this->entry_dimension = 0;
free(this->entries);
this->entries = NULL;
this->err = true;
}
const cnumber determinant() const {
cnumber dsum(1, 0);
@ -45,64 +49,57 @@ public:
return dsum - osum;
}
const vector get_diagonal() const {
long long diag_len = this->num_rows;
if (this->num_cols < diag_len) {
diag_len = this->num_cols;
long long diag_len = this->entry_dimension;
if (this->num_entries < diag_len) {
diag_len = this->num_entries;
}
vector v(diag_len);
for (long long i = 0; i < this->num_cols; i++) {
for (long long j = 0; j < this->num_rows; j++) {
for (long long i = 0; i < this->num_entries; i++) {
for (long long j = 0; j < this->entry_dimension; j++) {
if (i == j) {
v[i] = this->cols[i][j];
v[i] = this->entries[i][j];
}
}
}
return v;
}
const vector get_off_diagonal() const {
long long diag_len = this->num_rows;
if (this->num_cols < diag_len) {
diag_len = this->num_cols;
return this->rotate_by_one_pi().get_diagonal();
}
vector v(diag_len);
for (long long i = 0; i < this->num_cols; i++) {
for (long long j = 0; j < this->num_rows; j++) {
if (i + j == this->num_rows - 1) {
v[i] = this->cols[i][j];
}
}
}
return v;
}
const vector get_row(long long index) const { return this->cols[index]; }
const vector get_entry(long long index) const { return this->entries[index]; }
const vector get_column(long long index) const {
vector v(this->num_rows);
for (long long j = 0; j < this->num_rows; j++) {
v[j] = this->cols[j][index];
const vector get_row(long long index) const {
vector v(this->entry_dimension);
for (long long j = 0; j < this->entry_dimension; j++) {
v[j] = this->entries[j][index];
}
return v;
}
const matrix rotate_ninety() const {
matrix m(this->num_cols, this->num_rows);
return m;
const matrix rotate_by_one_pi() const {
matrix m = this->transpose();
matrix n = matrix(m.entry_dimension, m.num_entries);
for (long long i = 0; i < m.entry_dimension; i++) {
int index = m.num_entries - i - 1;
n[i] = m[index];
}
return n;
}
const matrix transpose() const {
matrix n(this->num_rows, this->num_cols);
for (long long i = 0; i < this->num_cols; i++) {
for (long long j = 0; j < this->num_rows; j++) {
n[j][i] = this->cols[i][j];
matrix n = matrix(this->entry_dimension, this->num_entries);
for (long long i = 0; i < this->num_entries; i++) {
for (long long j = 0; j < this->entry_dimension; j++) {
n[j][i] = this->entries[i][j];
}
}
return n;
}
const matrix conjugate() const {
matrix n(this->num_cols, this->num_rows);
for (long long i = 0; i < this->num_cols; i++) {
for (long long j = 0; j < this->num_rows; j++) {
n[i][j] = this->cols[i][j].conjugate();
matrix n = matrix(this->num_entries, this->entry_dimension);
for (long long i = 0; i < this->num_entries; i++) {
for (long long j = 0; j < this->entry_dimension; j++) {
n[i][j] = this->entries[i][j].conjugate();
}
}
@ -112,13 +109,13 @@ public:
return this->transpose().conjugate();
}
const bool is_hermitian() const {
if (this->num_rows != this->num_cols)
if (this->entry_dimension != this->num_entries)
return false;
matrix m = this->hermitian_conjugate();
bool equal = true;
for (long long i = 0; i < m.num_cols; i++) {
for (long long j = 0; j < m.num_rows; j++) {
if (m[i][j] != this->cols[i][j]) {
for (long long i = 0; i < m.num_entries; i++) {
for (long long j = 0; j < m.entry_dimension; j++) {
if (m[i][j] != this->entries[i][j]) {
equal = false;
}
}
@ -127,12 +124,12 @@ public:
}
friend ostream &operator<<(ostream &os, const matrix &m) {
char last = '\0';
for (long long i = 0; i < m.num_cols; i++) {
for (long long j = 0; j < m.num_rows; j++) {
for (long long i = 0; i < m.num_entries; i++) {
for (long long j = 0; j < m.entry_dimension; j++) {
string symbols[3];
symbols[0] = "|";
ostringstream oss;
oss << " " << m.cols[i][j] << " ";
oss << " " << m.entries[i][j] << " ";
symbols[1] = oss.str();
symbols[2] = "|";
for (int i = 0; i < 3; i++) {
@ -144,40 +141,44 @@ public:
last = symbols[i][len];
}
}
if (i != m.num_cols - 1)
if (i != m.num_entries - 1)
os << endl << "|";
}
return os;
}
const bool operator==(const matrix &m) const {
bool equal = true;
for (long long i = 0; i < this->num_cols; i++) {
for (long long j = 0; j < this->num_rows; j++) {
if (this->cols[i][j] != m[i][j]) {
for (long long i = 0; i < this->num_entries; i++) {
for (long long j = 0; j < this->entry_dimension; j++) {
if (this->entries[i][j] != m[i][j]) {
equal = false;
}
}
}
return equal;
}
vector &operator[](const long long index) { return this->entries[index]; }
const vector operator[](const long long index) const {
return this->cols[index];
return this->entries[index];
}
const matrix operator*(const cnumber z) const {
matrix n(this->num_cols, this->num_rows);
for (long long i = 0; i < this->num_cols; i++) {
n[i] = this->cols[i] * z;
matrix n(this->num_entries, this->entry_dimension);
for (long long i = 0; i < this->num_entries; i++) {
n[i] = this->entries[i] * z;
}
return n;
}
const matrix operator*(const matrix m) const {
matrix n(this->num_cols, m.num_rows);
// if (this->num_cols != m.num_rows && m.num_cols != this->num_rows)
// return n;
for (long long i = 0; i < this->num_rows; i++) {
for (long long j = 0; j < this->num_rows; j++) {
n[i][j] = this->get_row(i) * m.get_column(j);
matrix n(this->num_entries, m.entry_dimension);
if (this->num_entries != m.entry_dimension &&
m.num_entries != this->entry_dimension) {
n.err = true;
return n;
}
for (long long i = 0; i < this->entry_dimension; i++) {
for (long long j = 0; j < this->entry_dimension; j++) {
n[i][j] = this->get_entry(i) * m.get_row(j);
}
}
@ -185,22 +186,28 @@ public:
}
const matrix operator+(const matrix &m) const {
matrix n(this->num_cols, this->num_rows);
for (long long i = 0; i < this->num_cols; i++) {
n[i] = this->cols[i] + m[i];
matrix n(this->num_entries, this->entry_dimension);
for (long long i = 0; i < this->num_entries; i++) {
n[i] = this->entries[i] + m[i];
}
return n;
}
const matrix operator-(const matrix &m) const {
matrix n(this->num_cols, this->num_rows);
for (long long i = 0; i < this->num_cols; i++) {
n[i] = this->cols[i] - m[i];
matrix n(this->num_entries, this->entry_dimension);
for (long long i = 0; i < this->num_entries; i++) {
n[i] = this->entries[i] - m[i];
}
return n;
}
// FIXME: Figure out how to make sure you do not try to access something
// outside of the index
vector &operator[](const long long index) { return this->cols[index]; }
void operator=(const matrix &m) {
this->num_entries = m.num_entries;
this->entry_dimension = m.entry_dimension;
this->err = m.err;
free(this->entries);
this->entries = (vector *)malloc(sizeof(vector) * m.num_entries);
for (long long i = 0; i < m.num_entries; i++)
this->entries[i] = m[i];
}
};

Loading…
Cancel
Save