mirror of https://github.com/Askill/AP-SCE.git
120 lines
2.3 KiB
C++
120 lines
2.3 KiB
C++
#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;
|
|
} |