This file contains the definition of the Matrix
class
#ifndef __UNIT3_EXAMPLE_MATRIX_H__
#define __UNIT3_EXAMPLE_MATRIX_H__
#include <cstdlib>
class Matrix
{
public:
Matrix(size_t rows, size_t cols);
~Matrix();
void resize(size_t rows, size_t cols);
double get_elem(size_t r, size_t c);
void set_elem(size_t r, size_t c, double val);
size_t rows();
size_t cols();
private:
double *_data;
size_t _rows, _cols;
};
// computes C = A * B;
bool Matrix_multiply(Matrix *C, Matrix *A, Matrix *B);
#endif // ! defined __UNIT3_EXAMPLE_MATRIX_H__
This file contains the definition of the Vector
class
#ifndef __UNIT3_EXAMPLE_VECTOR_H__
#define __UNIT3_EXAMPLE_VECTOR_H__
#include <cstdlib>
class Vector
{
public:
Vector(size_t len);
~Vector();
void resize(size_t len);
double norm();
double norm(double p = 2);
double get_elem(size_t n);
void set_elem(size_t n, double val);
size_t length();
private:
double *_data;
size_t _len;
};
#endif // ! defined __UNIT3_EXAMPLE_VECTOR_H__
This file contains the implementation of the Matrix
class
#include "matrix.h"
#include <cmath>
Matrix::Matrix(size_t rows, size_t cols)
{
_rows = rows;
_cols = cols;
if (rows * cols == 0) {
_data = NULL;
} else {
_data = new double[rows * cols];
}
}
Matrix::~Matrix()
{
delete[] _data;
}
double
Matrix::get_elem(size_t r, size_t c)
{
if (r >= _rows || c >= _cols)
return NAN;
return _data[c + r * _cols];
}
void
Matrix::set_elem(size_t r, size_t c, double val)
{
if (r >= _rows || c >= _cols)
return;
_data[c + r * _cols] = val;
}
void
Matrix::resize(size_t rows, size_t cols)
{
_rows = rows;
_cols = cols;
delete[] _data;
if (rows * cols == 0) {
_data = NULL;
} else {
_data = new double[rows * cols];
}
}
size_t
Matrix::rows()
{
return _rows;
}
size_t
Matrix::cols()
{
return _cols;
}
bool
Matrix_multiply(Matrix *C, Matrix *A, Matrix *B)
{
if (A->cols() != B->rows())
return false;
C->resize(A->rows(), B->cols());
for (int i = 0; i < A->rows(); ++i) {
for (int j = 0; j < B->cols(); ++j) {
double c = 0;
for (int k = 0; k < A->cols(); ++k) {
c += A->get_elem(i, k) * B->get_elem(k, j);
}
C->set_elem(i, j, c);
}
}
return true;
}
This file contains the implementation of the Vector
class
#include "vector.h"
#include <cmath>
using namespace std;
Vector::Vector(size_t len)
{
_len = len;
if (len == 0) {
_data = NULL;
} else {
_data = new double[len];
}
}
Vector::~Vector()
{
delete[] _data;
}
double
Vector::norm()
{
norm(2);
}
double
Vector::norm(double p)
{
if (p < 1) {
return NAN;
} else if (p == 1) {
double sum = 0;
for (int i = 0; i < _len; ++i) {
sum += abs(_data[i]);
}
return sum;
} else if (p == 2) {
double sum = 0;
for (int i = 0; i < _len; ++i) {
sum += _data[i] * _data[i];
}
return sqrt(sum);
} else if (! isfinite(p)) {
double max = 0;
for (int i = 0; i < _len; ++i) {
if (abs(_data[i]) > max)
max = abs(_data[i]);
}
return max;
} else {
double sum = 0;
for (int i = 0; i < _len; ++i) {
sum += pow(_data[i], p);
}
return pow(sum, 1/p);
}
}
double
Vector::get_elem(size_t n)
{
return _data[n];
}
void
Vector::set_elem(size_t n, double val)
{
_data[n] = val;
}
size_t
Vector::length()
{
return _len;
}