public class matrice {
private vecteur[] elements;
//constructeurs
matrice(int n1, int n2)
{elements=new vecteur[n1];
for(int i=0;i<n1; i++)
elements[i]=new vecteur(n2);
}

matrice(double tableau [][])
{elements=new vecteur[tableau.length];
for(int i=0;i<tableau.length; i++)
elements[i]=new vecteur (tableau[i]);
}

matrice(matrice m)
{elements=new vecteur[m.nbLignes()];
for(int i=0;i<m.nbLignes(); i++)
{elements[i]=new vecteur (m.nbColonnes());
for(int j=0;j<m.nbColonnes(); j++)
{elements[i].toElt(j,m.coef(i,j));
}
}
}

// operateur d'affectation
public matrice affect(matrice m)
{
for(int i=0;i<m.nbLignes(); i++)
for(int j=0;j<m.nbColonnes(); j++)
elements[i].toElt(j,m.coef(i,j));
return this;
}

//Renvoie le nombre de lignes de la marice
public int nbLignes()
{return elements.length;
}

//Renvoie le nombre de colonnes de la marice
public int nbColonnes()
{return elements[0].dim();
}

//renvoie le coefficient a la ligne nl et la colonne nc
public double coef(int nl, int nc)
{return elements[nl].elt(nc);
}

//renvoie le vecteur situe a la ligne nl 
public vecteur vecLigne(int nl)
{return elements[nl];
}

//renvoie le vecteur situe a la colonne nc 
public vecteur vecColonne(int nc)
{int n=nbLignes();
vecteur x= new vecteur(n);
for (int i=0;i<n;i++)
x.toElt(i,elements[i].elt(nc));
return x;
}

//affecte la valeur de x au coefficient de la ligne nl et de la colonne nc
public void toCoef(int nl, int nc, double x)
{ elements[nl].toElt(nc,x);
}

//affecte le vecteur v a la ligne nl de la matrice
public void toVecLigne(int nl,vecteur v)
{ elements[nl]=v;
}

//affecte le vecteur v a la colonne nc de la matrice
public void toVecColonne(int nc,vecteur v)
{ int n=nbLignes();
vecteur x= new vecteur(n);
for (int i=0;i<n;i++)
toCoef(i,nc,v.elt(i));
}
// afficher la matrice
void afficher()
 {
for (int i=0;i<nbLignes();i++)
{
for (int j=0;j<nbColonnes();j++)
System.out.print(coef(i,j)+" ");
System.out.println(" ");
}
System.out.println(" ");
}

// produit matrice vecteur
public static vecteur produit(matrice m, vecteur x)
{
	vecteur y=new vecteur(x.dim());
	for (int i=0;i<x.dim();i++)
	{ double s=0;
for (int j=0;j<m.nbColonnes();j++)
s+= m.coef(i,j)*x.elt(j);
y.toElt(i,s);}

return y;
}

// produit de deux marices
public static matrice produit(matrice m1, matrice m2)
{
	matrice r=new matrice(m1.nbLignes(),m2.nbColonnes());
for (int i=0;i<m1.nbLignes();i++)
for (int j=0;j<m2.nbColonnes();j++)
{double s=0.0;
for (int k=0;k<m1.nbColonnes();j++)
s+=m1.coef(i,k)*m2.coef(k,j);
r.toCoef(i,j,s);
}
return r;

}

//addition de deux matrices
public static matrice plus(matrice m1, matrice m2)
{
	matrice r=new matrice(m1.nbLignes(),m2.nbColonnes());
for (int i=0;i<m1.nbLignes();i++)
for (int j=0;j<m2.nbColonnes();j++)
r.toCoef(i,j,m1.coef(i,j)+m2.coef(i,j));
return r;

}

//addition de deux matrices
public static matrice moins(matrice m1, matrice m2)
{
	matrice r=new matrice(m1.nbLignes(),m2.nbColonnes());
for (int i=0;i<m1.nbLignes();i++)
for (int j=0;j<m2.nbColonnes();j++)
r.toCoef(i,j,m1.coef(i,j)-m2.coef(i,j));
return r;
}
}