Matrica je deklarisana kao vector vectora. Potrebne biblioteke #include <vector>, include <algorithm> (za swap funkciju).
Koristena je motoda Gauss - Jordanove eliminacije
http://en.wikipedia.org/wiki/Gauss-Jordan_elimination
Code:
//Inverzna matrica Gauss - Jordanovom eliminacijom
void gaussj(std::vector<std::vector <double> > &rezultat)
{
int i,icol,irow,j,k,l,ll,n=brojRedovaMatrice(a);
double big,dum,pivinv;
std::vector <int> indxc(n),indxr(n),ipiv(n);
for (j=0;j<n;j++) ipiv[j]=0;
for (i=0;i<n;i++) {
big=0.0;
for (j=0;j<n;j++) //Vanjska petlja: pretraga za pivot
if (ipiv[j] != 1) //elementom.
for (k=0;k<n;k++) {
if (ipiv[k] == 0) {
if (abs(rezultat[j][k]) >= big) {
big=abs(rezultat[j][k]);
irow=j;
icol=k;
}
}
}
++(ipiv[icol]);
if (irow != icol) {
for (l=0;l<n;l++) std::swap(rezultat[irow][l],rezultat[icol][l]);
}
indxr[i]=irow; //Dijeljenje pivod reda
//sa pivot elementom, koji se nalazi na irow i icol.
indxc[i]=icol;
if (rezultat[icol][icol] == 0.0) throw("Matrica je singularna !");
pivinv=1.0/rezultat[icol][icol];
rezultat[icol][icol]=1.0;
for (l=0;l<n;l++) rezultat[icol][l] *= pivinv;
for (ll=0;ll<n;ll++) //reduciranje redova
if (ll != icol) { //osim onog kojeg sa kojim smo radili pivot
dum=rezultat[ll][icol];
rezultat[ll][icol]=0.0;
for (l=0;l<n;l++) rezultat[ll][l] -= rezultat[icol][l]*dum;
}
}
for (l=n-1;l>=0;l--) {
if (indxr[l] != indxc[l])
for (k=0;k<n;k++)
std::swap(rezultat[k][indxr[l]],rezultat[k][indxc[l]]);
} // ...Kraj !
}
if (argc > 1 && strcmp(argv[1], "-advice") == 0) {
printf("Don't Panic!n");
exit(42);
}