#include <stdio.h>
#include <conio.h>
float subMatrix(float *mat, int nSize);
void copySubMatrix(float *oMat, float *iMat, int nSize, int posM, int posN);
float result[16];
#define N_SIZE 4
int main(void)
{
float mat[N_SIZE][N_SIZE]={
1,2,3,4,
3,6,7,8,
1,3,3,5,
5,6,9,8
};
float *MatIn = &mat[0][0];
float result[N_SIZE][N_SIZE];
float det = 0;
int i, j, nSize = N_SIZE;
for(i=0; i<nSize; ++i)
{
for(j=0; j<nSize; ++j)
{
float *p_Copy = new float[(nSize-1)*(nSize-1)];
copySubMatrix(p_Copy, MatIn, nSize, i, j);
if((i+j)%2) result[i][j] = 0 - subMatrix(p_Copy, nSize-1);
else result[i][j] = subMatrix(p_Copy, nSize-1);
delete [] p_Copy;
}
}
for(i=0; i<nSize; ++i)
{
det +=result[0][i] * mat[0][i];
printf("det = %f\n", det);
}
if(det)
{
for(i=0; i<nSize; ++i)
{
for(j=0; j<nSize; ++j)
{
printf("%.2f\t", result[j][i]/det);
}
printf("\n");
}
}
getch();
return 0;
}
//get det(mat)
float subMatrix(float *mat, int nSize)
{
int i,j;
float det = 0;
if(nSize==2)
{
printf("%.1f * %.1f - %.1f * %.1f =%.1f \n",mat[0] , mat[3], mat[1], mat[2] ,mat[0] * mat[3] - mat[1] * mat[2]);
return mat[0] * mat[3] - mat[1] * mat[2];
}
//else case
for(i=0; i<nSize; ++i)
{
for(j=0; j<nSize; ++j)
{
float *p_Copy = new float[(nSize-1)*(nSize-1)];
copySubMatrix(p_Copy, mat, nSize, i, j);
if((i+j)%2) det -= mat[(i*nSize+j)]* subMatrix(p_Copy, nSize-1);
else det += mat[(i*nSize+j)]* subMatrix(p_Copy, nSize-1);
delete [] p_Copy;
}
}
return det;
}
void copySubMatrix(float *oMat, float *iMat, int nSize, int posM, int posN)
{
int i,j,oIndex = 0, iIndex;
for(i=0; i<nSize-1; ++i)
{
for(j=0; j<nSize-1; ++j)
{
iIndex = (i<posM)? i*nSize : (i+1)*nSize;
iIndex += (j<posN)? j: (j+1);
oMat[oIndex] = iMat[iIndex];
printf("%.1f\t", oMat[oIndex]);
oIndex++;
}
printf("\n");
}
printf("\n");
// getch();
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjb25pby5oPgoKCmZsb2F0IHN1Yk1hdHJpeChmbG9hdCAqbWF0LCBpbnQgblNpemUpOwp2b2lkIGNvcHlTdWJNYXRyaXgoZmxvYXQgKm9NYXQsIGZsb2F0ICppTWF0LCBpbnQgblNpemUsIGludCBwb3NNLCBpbnQgcG9zTik7CmZsb2F0IHJlc3VsdFsxNl07CgojZGVmaW5lIE5fU0laRSA0CgppbnQgbWFpbih2b2lkKQp7CglmbG9hdCBtYXRbTl9TSVpFXVtOX1NJWkVdPXsKCQkJCTEsMiwzLDQsCgkJCQkzLDYsNyw4LAoJCQkJMSwzLDMsNSwKCQkJCTUsNiw5LDgKCQkJCX07CgkJCQkKCWZsb2F0ICpNYXRJbiA9ICZtYXRbMF1bMF07CglmbG9hdCByZXN1bHRbTl9TSVpFXVtOX1NJWkVdOwoJCglmbG9hdCBkZXQgPSAwOwkKCQoJaW50IGksIGosIG5TaXplID0gTl9TSVpFOwoJCglmb3IoaT0wOyBpPG5TaXplOyArK2kpCgl7CgkJZm9yKGo9MDsgajxuU2l6ZTsgKytqKQoJCXsKCQkJZmxvYXQgKnBfQ29weSA9IG5ldyBmbG9hdFsoblNpemUtMSkqKG5TaXplLTEpXTsKCQkJY29weVN1Yk1hdHJpeChwX0NvcHksIE1hdEluLCBuU2l6ZSwgaSwgaik7CgkJCWlmKChpK2opJTIpCXJlc3VsdFtpXVtqXSA9IDAgLSBzdWJNYXRyaXgocF9Db3B5LCBuU2l6ZS0xKTsKCQkJZWxzZQkJcmVzdWx0W2ldW2pdID0gc3ViTWF0cml4KHBfQ29weSwgblNpemUtMSk7CgkJCWRlbGV0ZSBbXSBwX0NvcHk7CgkJfQoJfQoJCglmb3IoaT0wOyBpPG5TaXplOyArK2kpCgl7CgkJZGV0ICs9cmVzdWx0WzBdW2ldICogIG1hdFswXVtpXTsKCQlwcmludGYoImRldCA9ICVmXG4iLCBkZXQpOwoJfQoJaWYoZGV0KQoJewoJCWZvcihpPTA7IGk8blNpemU7ICsraSkKCQl7CgkJCWZvcihqPTA7IGo8blNpemU7ICsraikKCQkJewoJCQkJcHJpbnRmKCIlLjJmXHQiLCByZXN1bHRbal1baV0vZGV0KTsKCQkJfQoJCQlwcmludGYoIlxuIik7CgkJfQoJfQoJCgkKCQoKCglnZXRjaCgpOwoJcmV0dXJuIDA7Cn0KCi8vZ2V0IGRldChtYXQpCmZsb2F0IHN1Yk1hdHJpeChmbG9hdCAqbWF0LCBpbnQgblNpemUpCnsKCWludCBpLGo7CglmbG9hdCBkZXQgPSAwOwoJaWYoblNpemU9PTIpCgl7CgkJcHJpbnRmKCIlLjFmICogJS4xZiAtICUuMWYgKiAlLjFmID0lLjFmIFxuIixtYXRbMF0gLCBtYXRbM10sIG1hdFsxXSwgbWF0WzJdICxtYXRbMF0gKiBtYXRbM10gLSBtYXRbMV0gKiBtYXRbMl0pOwoJCXJldHVybiBtYXRbMF0gKiBtYXRbM10gLSBtYXRbMV0gKiBtYXRbMl07Cgl9CgkKCS8vZWxzZSBjYXNlCglmb3IoaT0wOyBpPG5TaXplOyArK2kpCgl7CgkJZm9yKGo9MDsgajxuU2l6ZTsgKytqKQoJCXsKCQkJZmxvYXQgKnBfQ29weSA9IG5ldyBmbG9hdFsoblNpemUtMSkqKG5TaXplLTEpXTsKCQkJY29weVN1Yk1hdHJpeChwX0NvcHksIG1hdCwgblNpemUsIGksIGopOwoJCQlpZigoaStqKSUyKQlkZXQgLT0gbWF0WyhpKm5TaXplK2opXSogc3ViTWF0cml4KHBfQ29weSwgblNpemUtMSk7CgkJCWVsc2UJCWRldCArPSBtYXRbKGkqblNpemUraildKiBzdWJNYXRyaXgocF9Db3B5LCBuU2l6ZS0xKTsKCQkJZGVsZXRlIFtdIHBfQ29weTsKCQkJCgkJfQoJfQoJcmV0dXJuIGRldDsKCQp9Cgp2b2lkIGNvcHlTdWJNYXRyaXgoZmxvYXQgKm9NYXQsIGZsb2F0ICppTWF0LCBpbnQgblNpemUsIGludCBwb3NNLCBpbnQgcG9zTikKewoJaW50IGksaixvSW5kZXggPSAwLCBpSW5kZXg7CgoJZm9yKGk9MDsgaTxuU2l6ZS0xOyArK2kpCgl7CgkJZm9yKGo9MDsgajxuU2l6ZS0xOyArK2opCgkJewoJCQlpSW5kZXggPSAoaTxwb3NNKT8gaSpuU2l6ZSA6IChpKzEpKm5TaXplOwoJCQlpSW5kZXggKz0gKGo8cG9zTik/IGo6IChqKzEpOwoJCQlvTWF0W29JbmRleF0gPSBpTWF0W2lJbmRleF07CgoJCQlwcmludGYoIiUuMWZcdCIsIG9NYXRbb0luZGV4XSk7CgkJCW9JbmRleCsrOwoJCX0KCQlwcmludGYoIlxuIik7Cgl9CglwcmludGYoIlxuIik7Ci8vCWdldGNoKCk7Cn0KCgo=