

// m: Matrix, nz: Anzahl der Zeilen
function MatrixInvert(m,nz)
{
	var i, j, k, nn=nz*nz, i0, i1;
	var q, I =new Array(nz*nz);
	for(i=0;i<nn;i++)I[i]=0;
	for(i=0;i<nn;i+=nz+1)I[i]=1;
	for (j = 0;j<nz;j++)
	{
		// Diagonalenfeld normalisieren
		q = m[j * nz + j];
		if (q == 0)
		{
			//Gewährleisten, daß keine 0 in der Diagonale steht
			for (i = j+1 ;i< nz;i++)
			{
				// Suche Reihe mit Feld <> 0 und addiere dazu
				if (m[i * nz + j] != 0)
				{
					for(k=0;k<nz;k++)
					{
						m[i0=j*nz+k]+=m[i1=i*nz+k];
						I[i0]+=I[i1];
					}
					q = m[j * nz + j];
                    		break;
                		}
            	}
		}
		if (q != 0)
		{
            	// Diagonalen auf 1 bringen
			for(k=0;k<nz;k++)
			{
				m[i0=j*nz+k]=m[i1=j*nz+k]/q;
				I[i0]=I[i1]/q;
			}
		}
		// Spalten außerhalb der Diagonalen auf 0 bringen
		for (i = 0 ; i< nz ; i++)
		{
			if (i != j )
			{
				q = m[i * nz + j];
				for(k=0;k<nz;k++)
				{
					I[i0=i*nz+k]-=q*I[i1=j*nz+k];
					m[i0]-=q*m[i1];
				}
			}
		}
	}
	for(i=0;i<nz;i++)for(j=0;j<nz;j++)if(m[i*nz+j]!=((i==j)?1:0))return false;
	for(i=0;i<nn;i++) m[i]=I[i];
	return true;
}

