#include "matrix.h" #include "mathfunc.h" #include "gadget.h" //TODO usar mallock Matrix::Matrix(int nr, int nc, double value) { m = new double[nr * nc]; nrow = nr; ncol = nc; int i, j; for (i = 0; i < nr; i++) { for (j = 0; j < nc; j++) m[i*ncol+j] = value; } } //Matrix::Matrix(const DoubleMatrix& initial) : nrow(initial.nrow) { // int i; // if (nrow >= 0) { //// v = new DoubleVector*[nrow]; //// for (i = 0; i < nrow; i++) //// v[i] = new DoubleVector(initial[i]); // v = new double[nrow][initial.Ncol(0)]; // int i,j; // // for (i = 0; i < nrow; i++) // for (j = 0; j < initial.Ncol(0); j++) // v[i][j] = initial[i][j]; // } else { // v = 0; // nrow = 0; // } //} Matrix::~Matrix() { int i; if (m != 0) { delete[] m; m = 0; ncol = nrow = 0; } } void Matrix::AddRows(int add, int length, double value) { if (add <= 0) return; int i, j; if (m == 0) { nrow = add; ncol = length; m = new double[nrow*ncol]; for (i = 0; i < nrow; i++) { for (j = 0; j < length; j++) m[i*ncol+j] = value; } } else { int aux = nrow + add; double* vnew = new double[aux*length]; for (i = 0; i < nrow; i++) for (j = 0; j < length; j++) vnew[i*ncol+j] = m[i*ncol+j]; for (i = nrow; i < nrow + add; i++) { for (j = 0; j < length; j++) vnew[i*ncol+j] = value; } delete[] m; m = vnew; nrow = aux; } } //void Matrix::Delete(int pos) { // delete v[pos]; // int i; // if (nrow > 1) { // DoubleVector** vnew = new DoubleVector*[nrow - 1]; // for (i = 0; i < pos; i++) // vnew[i] = v[i]; // for (i = pos; i < nrow - 1; i++) // vnew[i] = v[i + 1]; // delete[] v; // v = vnew; // nrow--; // } else { // delete[] v; // v = 0; // nrow = 0; // } //} //Matrix &Matrix::operator = (const Matrix& d) { // int i,j; //// if (v != 0) { //// for (i = 0; i < nrow; i++) //// delete v[i]; //// delete[] v; //// } // if (m != 0) // delete[] m; // // nrow = d.nrow; // ncol = d.ncol; // // double* aux; // if (nrow > 0) { // m = d.m; ////// v = new double*[nrow]; //// m = new double[nrow * ncol]; ////// for (i = 0; i < nrow; i++) ////// v[i] = new double(*d[i]); //// cout << "0000000?????????:" << d[20] << endl; //// for (i = 0; i < nrow; i++) { //// for (j = 0; j < ncol; j++){ ////// cout << "j:" << j << endl; //// cout << "????????????????????0" << endl; //// aux = (double*) d[i*ncol+j]; //// cout << "????????????????????1" << endl; //// m[i*ncol+j] = 0; ////// cout << "????????????????????2" << endl; //// } //// } // } else // m = 0; // // return *this; //} void Matrix::Reset() { if (nrow > 0) { int i; delete[] m; m = 0; nrow = 0; ncol = 0; } } void Matrix::Initialize(int nr, int nc, double initial) { if (m != 0) delete[] m; m = new double[nr * nc]; nrow = nr; ncol = nc; int i, j; for (i = 0; i < nr; i++) { for (j = 0; j < nc; j++) m[i*ncol+j] = initial; } } void Matrix::Print(ofstream& outfile) const { int i, j; for (i = 0; i < nrow; i++) { outfile << TAB; for (j = 0; j < ncol; j++) outfile << setw(smallwidth) << setprecision(smallprecision) << m[i*ncol+j] << sep; outfile << endl; } } void Matrix::setToZero() { int i, j; for (i = 0; i < nrow; i++) for (j = 0; j < ncol; j++) m[i*ncol+j] = 0.0; }