public class Matrica {
    private int m,n;

    private double[][] tablica;

    private boolean transponirana;

    // Konstruktor koji radi nulmatricu tipa axb
    public Matrica(int a,int b) {
	int i,j;

	m=a;
	n=b;
	
	tablica=new double[m][n];

	for (i=0;i<m;i++)
	    for (j=0;j<n;j++)
		tablica[i][j]=0;

	transponirana=false;
    }

    // Konstruktor koji nacini tablicu iz zaprimljenog polja
    public Matrica(double[][] polje) {
	int i,j;

	m=polje.length;
	n=polje[0].length;

	tablica=new double[m][n];

	for (i=0;i<m;i++)
	    for (j=0;j<n;j++)
		tablica[i][j]=polje[i][j];

	transponirana=false;
    }

    public int retci() {
	return m;
    }

    public int stupci() {
	return n;
    }

    public void stavi(int i,int j,double v) {
	if (transponirana)
	    tablica[j][i]=v;
	else
	    tablica[i][j]=v;
    }

    public double vrati(int i,int j) {
	if (transponirana)
	    return tablica[j][i];
	else
	    return tablica[i][j];
    }

    public void transponiraj() {
	int t=m;
	m=n;
	n=t;
	transponirana=!transponirana;
    }

    public Matrica zbroji(Matrica A) {
	int i,j;
	Matrica R=new Matrica(m,n);

	for (i=0;i<m;i++)
	    for (j=0;j<n;j++)
		R.stavi(i,j,vrati(i,j)+A.vrati(i,j));

	return R;
    }

    public Matrica mnozi(Matrica A) {
	int i,j,k;
	Matrica R=new Matrica(m,A.stupci());

	for (i=0;i<m;i++)
	    for (j=0;j<A.stupci();j++)
		for (k=0;k<n;k++)
		    R.stavi(i,j,R.vrati(i,j)+vrati(i,k)*A.vrati(k,j));

	return R;
    }

    public void ispisi() {
	int i,j;
	for (i=0;i<m;i++) {
	    for (j=0;j<n;j++)
		System.out.print(vrati(i,j)+" ");
	    System.out.println();
	}
    }
}
