dynare/dynare++/tl/cc/twod_matrix.cc

112 lines
2.3 KiB
C++
Raw Normal View History

// Copyright 2004, Ondra Kamenik
#include "twod_matrix.hh"
#include "tl_exception.hh"
ConstTwoDMatrix::ConstTwoDMatrix(const TwoDMatrix &m)
: ConstGeneralMatrix(m)
{
}
ConstTwoDMatrix::ConstTwoDMatrix(const TwoDMatrix &m, int first_col, int num)
: ConstGeneralMatrix(m, 0, first_col, m.nrows(), num)
{
}
ConstTwoDMatrix::ConstTwoDMatrix(const ConstTwoDMatrix &m, int first_col, int num)
: ConstGeneralMatrix(m, 0, first_col, m.nrows(), num)
{
}
ConstTwoDMatrix::ConstTwoDMatrix(int first_row, int num, const TwoDMatrix &m)
: ConstGeneralMatrix(m, first_row, 0, num, m.ncols())
{
}
ConstTwoDMatrix::ConstTwoDMatrix(int first_row, int num, const ConstTwoDMatrix &m)
: ConstGeneralMatrix(m, first_row, 0, num, m.ncols())
{
}
void
ConstTwoDMatrix::writeMat(mat_t *fd, const char *vname) const
{
size_t dims[2];
dims[0] = nrows();
dims[1] = ncols();
auto *data = new double[nrows()*ncols()];
for (int j = 0; j < ncols(); j++)
for (int i = 0; i < nrows(); i++)
data[j*nrows()+i] = get(i, j);
matvar_t *v = Mat_VarCreate(vname, MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, data, 0);
2019-02-12 15:58:29 +01:00
Mat_VarWrite(fd, v, MAT_COMPRESSION_NONE);
Mat_VarFree(v);
delete[] data;
}
TwoDMatrix &
TwoDMatrix::operator=(const ConstTwoDMatrix &m)
{
GeneralMatrix::operator=(m);
return *this;
}
void
TwoDMatrix::copyRow(int from, int to)
{
if (from != to)
copyRow(ConstTwoDMatrix(*this), from, to);
}
void
TwoDMatrix::copyRow(const ConstTwoDMatrix &m, int from, int to)
{
getRow(to) = m.getRow(from);
}
void
TwoDMatrix::addRow(double d, const ConstTwoDMatrix &m, int from, int to)
{
getRow(to).add(d, m.getRow(from));
}
void
TwoDMatrix::copyColumn(int from, int to)
{
if (from != to)
copyColumn(ConstTwoDMatrix(*this), from, to);
}
void
TwoDMatrix::copyColumn(const ConstTwoDMatrix &m, int from, int to)
{
getCol(to) = m.getCol(from);
}
void
TwoDMatrix::addColumn(double d, const ConstTwoDMatrix &m, int from, int to)
{
getCol(to).add(d, m.getCol(from));
}
void
TwoDMatrix::save(const char *fname) const
{
FILE *fd;
if (nullptr == (fd = fopen(fname, "w")))
{
TL_RAISE("Cannot open file for writing in TwoDMatrix::save");
}
for (int row = 0; row < nrows(); row++)
{
for (int col = 0; col < ncols(); col++)
fprintf(fd, " %20.10g", get(row, col));
fprintf(fd, "\n");
}
fclose(fd);
}