#include <iostream>
using namespace std;

template <int W, int H>
class martrix{
	float _m[W][H];
public:
	martrix(){
		for (int x=0;x<W;x++)
			for (int y=0;y<H;y++)
				_m[x][y] = 0;
	}
	float& at(int x, int y){
		return _m[x][y];
	}

	const martrix<W,H> add(const martrix<W,H>& m)const{
		martrix<W,H> out;
		for (int x=0;x<W;x++)
			for (int y=0;y<H;y++)
				out.at(x,y) = _m[x][y] + m.at(x,y);
		return out;
	}
	template<int WW,int HH>
	const martrix<WW,H> mul(martrix<WW,HH>& m){
		martrix<WW,H> out;
		for (int xx = 0;xx<WW;xx++)
			for (int y=0;y<H;y++)
			{
				out.at(xx,y) = 0;
				for (int i=0;i<W;i++)
					out.at(xx,y) += _m[i][y] * m.at(xx,i);
			}
		return out;
	}
	void print(ostream& out){
		for (int y=0;y<H;y++)
		{
			for (int x=0;x<W;x++)
				out << _m[x][y] << " ";
			out << endl;
		}
	}
};

int main()
{
	cout << "martrix.... it's matrix operation by martin\n";

	cout << "matrix A\n";
	martrix<3,2> A;
	A.at(0,0) = 1;
	A.at(1,0) = 2;
	A.at(2,0) = 3;
	A.at(0,1) = 4;
	A.at(1,1) = 5;
	A.at(2,1) = 6;
	A.print(cout);
	cout << endl;

	cout << "matrix B\n";
	martrix<2,3> B;
	B.at(0,0) = 7;
	B.at(1,0) = 8;
	B.at(0,1) = 9;
	B.at(1,1) = 10;
	B.at(0,2) = 11;
	B.at(1,2) = 12;
	B.print(cout);
	cout << endl;

	martrix<2,2> C = A.mul<2,3>(B);

	C.print(cout);

	return 0;
}
