14 std::vector<double> data;
17 Matrix(
int dim1,
int dim2);
19 Matrix(
const Matrix& M);
23 Matrix& operator=(
const Matrix& M);
25 double operator[](
int index)
const;
27 double& operator[](
int index);
29 Matrix operator*(
const Matrix& M);
31 Matrix subMatrix(
int i,
int j);
37 double value(
int i1,
int i2)
const{
38 return data[i1*cols+i2];
41 double& value(
int i1,
int i2){
42 return data[i1*cols+i2];
54 for(
int i=0;i<rows*cols;i++){
60 for(
int i=0;i<rows;i++){
61 for(
int j=0;j<cols;j++){
62 std::cout<<value(i,j)<<
"\t";
70 std::vector<double> getData()
const{
74 void exportToFile(
const char *filename);
78 for(
int i=0;i<rows;i++){
79 for(
int j=0;j<cols;j++){
80 vecnorm += value(i,j)*value(i,j);
83 vecnorm = vecnorm/(rows*cols);
84 return(std::sqrt(vecnorm));
87 Matrix operator+(
const Matrix& m){
89 for(
int i=0;i<rows;i++){
90 for(
int j=0;j<cols;j++){
91 newmat.value(i,j) += m.value(i,j);
98 Matrix operator-(
const Matrix& m){
100 for(
int i=0;i<rows;i++){
101 for(
int j=0;j<cols;j++){
102 newmat.value(i,j) -= m.value(i,j);
108 double dp(
const Matrix& m){
110 for(
int i=0;i<rows;i++){
111 res += value(i,0)*m.value(i,0);
116 Matrix sc(
double val){
117 Matrix newmat(*
this);
118 for(
int i=0;i<rows;i++){
119 for(
int j=0;j<cols;j++){
120 newmat.value(i,j) = val*newmat.value(i,j);
129Matrix::Matrix(
int dim1_,
int dim2_){
133 data.resize(rows*cols);
135 std::fill(data.begin(),data.end(),0.0);
138Matrix::Matrix(
const Matrix &M){
146Matrix& Matrix::operator=(
const Matrix &M){
156double& Matrix::operator[](
int index){
160double Matrix::operator[](
int index)
const{
165Matrix Matrix::operator*(
const Matrix& M){
166 if(this->cols != M.getRows()){
167 std::cerr<<
"Dimensions incompatible for matrix multiplication"<<std::endl;
177 for(
int i=0;i<r;i++){
178 for(
int j=0;j<c;j++){
179 for(
int k=0;k<this->cols;k++){
180 result.value(i,j) += value(i,k)*M.value(k,j);
188Matrix Matrix::subMatrix(
int r,
int c){
189 Matrix sub(rows-1,cols-1);
192 for(
int i=0;i<rows-1;i++){
193 for(
int j=0;j<cols-1;j++){
203 sub.value(i,j) = value(temp_i,temp_j);
210Matrix Matrix::transpose(){
211 Matrix trans(cols,rows);
213 for(
int i=0;i<cols;i++){
214 for(
int j=0;j<rows;j++){
215 trans.value(i,j) = this->value(j,i);
222Matrix Matrix::invert(){
224 std::cerr<<
"Matrix not invertible"<<std::endl;
227 Matrix inv(rows,cols);
228 for(
int i=0;i<rows;i++){
229 for(
int j=0; j<cols;j++){
230 Matrix temp = subMatrix(i,j);
231 inv.value(i,j) = temp.det()*pow(-1,i+j);
235 inv = inv.transpose();
236 inv.scale(1.0/(this->det()));
243 std::cerr<<
"Not a square matrix. Hence can't compute the determinant."<<std::endl;
252 return (value(0,0)*value(1,1)-value(0,1)*value(1,0));
256 for(
int i=0;i<3;i++){
257 Matrix temp(this->subMatrix(0,i));
259 det += pow(-1,i)*value(0,i)*temp.det();
266void Matrix::exportToFile(
const char* filename){
267 std::ofstream outfile;
268 outfile.open(filename);
270 for(
int i=0;i<rows;i++){
271 for(
int j=0;j<cols;j++){
272 outfile<<value(i,j)<<std::endl;