mirror of https://github.com/Askill/AP-SCE.git
- added 2.2 cramer
This commit is contained in:
parent
504bde8da8
commit
4d9fc9de8a
|
|
@ -0,0 +1,120 @@
|
|||
#include "mex.h"
|
||||
#include "matrix.h"
|
||||
#include "stdlib.h"
|
||||
|
||||
|
||||
double** CA;
|
||||
double** CA2;
|
||||
double* x;
|
||||
int variables;
|
||||
|
||||
|
||||
void copy_array()
|
||||
{
|
||||
for (int i = 0; i < variables; ++i)
|
||||
for (int n = 0; n < variables + 1; ++n)
|
||||
CA2[i][n] = CA[i][n];
|
||||
}
|
||||
|
||||
void swap_column(double** ca2, int col)
|
||||
{
|
||||
double* temp = (double *)mxCalloc(variables, sizeof(double));
|
||||
copy_array();
|
||||
for(int i=0; i < variables ;i++)
|
||||
{
|
||||
temp[i] = CA[i][variables];
|
||||
}
|
||||
for(int i=0; i < variables ;i++)
|
||||
{
|
||||
CA2[i][col] = temp[i];
|
||||
}
|
||||
free(temp);
|
||||
}
|
||||
|
||||
double determinant(double** ga, int m)
|
||||
{
|
||||
|
||||
double sum = 0;
|
||||
double** t = (double **)mxCalloc(variables, sizeof(double*));
|
||||
for (int i = 0; i < variables; ++i)
|
||||
t[i] = (double *)mxCalloc(variables, sizeof(double));
|
||||
|
||||
|
||||
if (m == 2)
|
||||
{
|
||||
sum = ga[0][0] * ga[1][1] - ga[0][1] * ga[1][0];
|
||||
return sum;
|
||||
}
|
||||
for (int p = 0; p<m; p++)
|
||||
{
|
||||
int h = 0, k = 0;
|
||||
for (int i = 1; i<m; i++)
|
||||
{
|
||||
for (int j = 0; j<m; j++)
|
||||
{
|
||||
if (j == p)
|
||||
continue;
|
||||
t[h][k] = ga[i][j];
|
||||
k++;
|
||||
if (k == m - 1)
|
||||
{
|
||||
h++;
|
||||
k = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
sum = sum + ga[0][p] * pow(-1, p)*determinant(t, m - 1);
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
void mexFunction(int nlhs, mxArray *plhs[], // Output variables
|
||||
int nrhs, const mxArray *prhs[]) // Input variables
|
||||
{
|
||||
variables = *mxGetPr(prhs[0]);
|
||||
|
||||
double* x = (double *)mxCalloc(variables, sizeof(double));
|
||||
|
||||
CA = (double **)mxCalloc(variables, sizeof(double*)); //create original array
|
||||
CA2 = (double **)mxCalloc(variables, sizeof(double*)); //create working array
|
||||
|
||||
for (int i = 0; i <= variables; i++){
|
||||
CA[i] = (double *)mxCalloc(variables, sizeof(double));
|
||||
}
|
||||
for (int i = 0; i <= variables; i++){
|
||||
CA2[i] = (double *)mxCalloc(variables, sizeof(double));
|
||||
}
|
||||
|
||||
for(int i = 0; i < variables*(variables+1); i++){ //copy input array into ca and ca2
|
||||
CA[i%variables][i/variables] = mxGetPr(prhs[1])[i];
|
||||
CA2[i%variables][i/variables] = mxGetPr(prhs[1])[i];
|
||||
}
|
||||
//Actual cramer
|
||||
|
||||
double detA = determinant(CA,variables);
|
||||
|
||||
copy_array();
|
||||
|
||||
for(int i = 0; i < variables; i++)
|
||||
{
|
||||
swap_column(CA2, i);
|
||||
x[i] = determinant(CA2, variables);
|
||||
}
|
||||
|
||||
// Output
|
||||
for(int j=0; j < variables; j++){
|
||||
plhs[j]=mxCreateDoubleScalar(x[j]/detA );
|
||||
|
||||
}
|
||||
// free memory
|
||||
for (int i = 0; i <= variables; i++ ){
|
||||
free(CA2[i]);
|
||||
}
|
||||
|
||||
free(CA2);
|
||||
free(x);
|
||||
|
||||
return;
|
||||
}
|
||||
Loading…
Reference in New Issue