Cubli library
Diff: Matrix/Matrix.cpp
- Revision:
- 1:085840a3d767
- Parent:
- 0:431ee55036ca
- Child:
- 2:dc7840a67f77
--- a/Matrix/Matrix.cpp Wed Feb 13 13:07:37 2019 +0000 +++ b/Matrix/Matrix.cpp Wed Feb 13 17:06:28 2019 +0000 @@ -2,50 +2,74 @@ Matrix::Matrix() : _rows(1), _cols(1) { - // Allocate memory - _data = (float **)malloc(sizeof(float *)); - _data[0] = (float *)malloc(sizeof(float)); - // Initialize values - _data[0][0] = 0.0; + // Allocate memory + _data = (float **)malloc(sizeof(float *)); + _data[0] = (float *)malloc(sizeof(float)); + // Initialize values + _data[0][0] = 0.0; } Matrix::Matrix(int rows, int cols) : _rows(rows), _cols(cols) { - // Allocate memory - _data = (float **)malloc(_rows * sizeof(float *)); // = new float*[_rows]; - for (int i = 1; i <= _rows; i++) - { - _data[i-1] = (float *)malloc(_cols * sizeof(float)); // = new float[_cols]; - } - // Initialize values - for (int i = 1; i <= _rows; i++) - { - for (int j = 1; j <= _cols; j++) - { - _data[i-1][j-1] = 0.0; + // Allocate memory + _data = (float **)malloc(_rows * sizeof(float *)); // = new float*[_rows]; + for (int i = 1; i <= _rows; i++) { + _data[i-1] = (float *)malloc(_cols * sizeof(float)); // = new float[_cols]; } - } + // Initialize values + for (int i = 1; i <= _rows; i++) { + for (int j = 1; j <= _cols; j++) { + _data[i-1][j-1] = 0.0; + } + } } Matrix::~Matrix() { // Free memory - for (int i = 0; i < _rows; ++i) { - free(_data[i]); + for (int i = 1; i <= _rows; i++) { + free(_data[i-1]); } free(_data); } +Matrix& Matrix::operator=(const Matrix& m) +{ + for (int i = 1; i <= _rows; i++) { + for (int j = 1; j <= _cols; j++) { + _data[i-1][j-1] = m._data[i-1][j-1]; + } + } + return *this; +} + float& Matrix::operator()(int row, int col) { - // Return cell data - return _data[row-1][col-1]; + // Return cell data + return _data[row-1][col-1]; } Matrix operator+(const Matrix& A, const Matrix& B) { - // Auxiliary matrix where C = A+B + /*// Auxiliary matrix where C = A+B + Matrix C(A._rows,A._cols); + for (int i = 1; i <= A._rows; i++) + { + for (int j = 1; j <= A._cols; j++) + { + C._data[i-1][j-1] += A._data[i-1][j-1]+B._data[i-1][j-1]; + } + } + return C; + */ + + /*Matrix temp(m1); + return (temp += m2); + */ + + //Matrix A(m1); + //Matrix B(m2); Matrix C(A._rows,A._cols); for (int i = 1; i <= A._rows; i++) { @@ -61,12 +85,10 @@ { // Auxiliary matrix where C = A-B Matrix C(A._rows,A._cols); - for (int i = 1; i <= A._rows; i++) - { - for (int j = 1; j <= A._cols; j++) - { - C._data[i-1][j-1] += A._data[i-1][j-1]-B._data[i-1][j-1]; - } + for (int i = 1; i <= A._rows; i++) { + for (int j = 1; j <= A._cols; j++) { + C._data[i-1][j-1] += A._data[i-1][j-1]-B._data[i-1][j-1]; + } } return C; } @@ -75,15 +97,12 @@ { // Auxiliary matrix where C = A*B Matrix C(A._rows,B._cols); - for (int i = 1; i <= A._rows; i++) - { - for (int j = 1; j <= B._cols; j++) - { - for (int k = 1; k <= A._cols; k++) - { - C._data[i-1][j-1] += A._data[i-1][k-1]*B._data[k-1][j-1]; + for (int i = 1; i <= A._rows; i++) { + for (int j = 1; j <= B._cols; j++) { + for (int k = 1; k <= A._cols; k++) { + C._data[i-1][j-1] += A._data[i-1][k-1]*B._data[k-1][j-1]; + } } - } } return C; } @@ -92,12 +111,34 @@ { // Auxiliary matrix where C = scalar*A Matrix C(A._rows,A._cols); - for (int i = 1; i <= A._rows; i++) - { - for (int j = 1; j <= A._cols; j++) - { - C._data[i-1][j-1] += scalar*A._data[i-1][j-1]; - } + for (int i = 1; i <= A._rows; i++) { + for (int j = 1; j <= A._cols; j++) { + C._data[i-1][j-1] += scalar*A._data[i-1][j-1]; + } + } + return C; +} + +Matrix operator*(const Matrix& A, float scalar) +{ + // Auxiliary matrix where C = scalar*A + Matrix C(A._rows,A._cols); + for (int i = 1; i <= A._rows; i++) { + for (int j = 1; j <= A._cols; j++) { + C._data[i-1][j-1] += A._data[i-1][j-1]*scalar; + } + } + return C; +} + +Matrix operator/(const Matrix& A, float scalar) +{ + // Auxiliary matrix where C = scalar*A + Matrix C(A._rows,A._cols); + for (int i = 1; i <= A._rows; i++) { + for (int j = 1; j <= A._cols; j++) { + C._data[i-1][j-1] += A._data[i-1][j-1]/scalar; + } } return C; } @@ -106,10 +147,8 @@ { // Auxiliary matrix where C = A' Matrix C(A._cols, A._rows); - for (int i = 1; i <= C._rows; i++) - { - for (int j = 1; j <= C._cols; j++) - { + for (int i = 1; i <= C._rows; i++) { + for (int j = 1; j <= C._cols; j++) { C._data[i-1][j-1] = A._data[j-1][i-1]; } } @@ -118,33 +157,25 @@ Matrix inverse(const Matrix& A) { - // Apply A = LDL' factorization where L is a lower triangular matrix and D + // Apply A = LDL' factorization where L is a lower triangular matrix and D // is a block diagonal matrix Matrix L(A._cols, A._rows); Matrix D(A._cols, A._rows); float L_sum; float D_sum; - for (int i = 1; i <= A._rows; i++) - { - for (int j = 1; j <= A._rows; j++) - { - if (i >= j) - { - if (i == j) - { + for (int i = 1; i <= A._rows; i++) { + for (int j = 1; j <= A._rows; j++) { + if (i >= j) { + if (i == j) { L._data[i-1][j-1] = 1.0; D_sum = 0.0; - for (int k = 1; k <= (i-1); k++) - { + for (int k = 1; k <= (i-1); k++) { D_sum += L._data[i-1][k-1]*L._data[i-1][k-1]*D._data[k-1][k-1]; } D._data[i-1][j-1] = A._data[i-1][j-1] - D_sum; - } - else - { + } else { L_sum = 0.0; - for (int k = 1; k <= (j-1); k++) - { + for (int k = 1; k <= (j-1); k++) { L_sum += L._data[i-1][k-1]*L._data[j-1][k-1]*D._data[k-1][k-1]; } L._data[i-1][j-1] = (1.0/D._data[j-1][j-1])*(A._data[i-1][j-1]-L_sum); @@ -152,26 +183,19 @@ } } } - // Compute the inverse of L and D matrices + // Compute the inverse of L and D matrices Matrix L_inv(A._cols, A._rows); Matrix D_inv(A._cols, A._rows); float L_inv_sum; - for (int i = 1; i <= A._rows; i++) - { - for (int j = 1; j <= A._rows; j++) - { - if (i >= j) - { - if (i == j) - { + for (int i = 1; i <= A._rows; i++) { + for (int j = 1; j <= A._rows; j++) { + if (i >= j) { + if (i == j) { L_inv._data[i-1][j-1] = 1.0/L._data[i-1][j-1]; D_inv._data[i-1][j-1] = 1.0/D._data[i-1][j-1]; - } - else - { + } else { L_inv_sum = 0.0; - for (int k = j; k <= (i-1); k++) - { + for (int k = j; k <= (i-1); k++) { L_inv_sum += L._data[i-1][k-1]*L_inv._data[k-1][j-1]; } L_inv._data[i-1][j-1] = -L_inv_sum; @@ -179,7 +203,18 @@ } } } - // Compute the inverse of A matrix in terms of the inverse of L and D - // matrices + // Compute the inverse of A matrix in terms of the inverse of L and D + // matrices return transpose(L_inv)*D_inv*L_inv; } + +float norm(const Matrix& A) +{ + // Auxiliary matrix where C = A' + float n; + n = 0.0; + for (int i = 1; i <= A._rows; i++) { + n += A._data[i-1][0]*A._data[i-1][0]; + } + return sqrt(n); +}