#include "matrixdense.h"
#include "sigmoid.h"

MatrixDense::MatrixDense()
{
    //ctor
}

MatrixDense::MatrixDense(int n, int m)
{
    nrow = n;
    mcol = m;
    mat = vector<double>(n*m);
    int nm = max(n,m);
    for(int i = 0; i<n; ++i)
    {
        for(int j = 0; j<m; ++j)
        {
            mat[i*m+j] = sigmoid(xk(i,nm))*sigmoid(xk(j,nm));
        }
    }
}

vector<double> MatrixDense::Mult(const vector<double> &x) const
{
    vector<double> y(nrow,0);
    for(int n=0; n<nrow; ++n)
    {
        for(int m=0; m<mcol; ++m)
        {
            y[n] += mat[n*mcol+m]*x[m];
        }
    }
    return y;
}

vector<double> MatrixDense::MultT(const vector<double> &x) const
{
    vector<double> y(mcol,0);
    for(int m=0; m<mcol; ++m) // over columns
    {
        for(int n=0; n<nrow; ++n)   // over rows
        {
            y[m] += mat[n*mcol+m]*x[n];
        }
    }
    return y;
}

MatrixDense::~MatrixDense()
{
    //dtor
}
