Switch to side-by-side view

--- a
+++ b/combinedDeepLearningActiveContour/minFunc/mcholC.c
@@ -0,0 +1,199 @@
+#include <math.h>
+#include "mex.h"
+
+double mymax(double x, double y)
+{
+    if (x > y)
+        return x;
+    else
+        return y;
+}
+
+double absolute(double x)
+{
+    if (x >= -x)
+        return x;
+    else
+        return -x;
+}
+
+void permuteInt(int *x, int p, int q)
+{
+    int temp;
+    temp = x[p];
+    x[p] = x[q];
+    x[q] = temp;
+}
+
+void permute(double *x, int p, int q)
+{
+    double temp;
+    temp = x[p];
+    x[p] = x[q];
+    x[q] = temp;
+}
+
+void permuteRows(double *x, int p, int q,int n)
+{
+    int i;
+    double temp;
+    for(i = 0; i < n; i++)
+    {
+        temp = x[p+i*n];
+        x[p+i*n] = x[q+i*n];
+        x[q+i*n] = temp;
+    }
+}
+
+void permuteCols(double *x, int p, int q,int n)
+{
+    int i;
+    double temp;
+    for(i = 0; i < n; i++)
+    {
+        temp = x[i+p*n];
+        x[i+p*n] = x[i+q*n];
+        x[i+q*n] = temp;
+    }
+}
+
+void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
+{
+    int n,sizL[2],sizD[2],i,j,q,s,
+    *P;
+    
+    double mu,gamma,xi,delta,beta,maxVal,theta,
+    *c,    *H, *L, *D, *A;
+    
+    /* Input */
+    H = mxGetPr(prhs[0]);
+    if (nrhs == 1)
+    {
+        mu = 1e-12;
+    }
+    else
+    {
+        mu = mxGetScalar(prhs[1]);
+    }
+    
+    /* Compute Sizes */
+    n = mxGetDimensions(prhs[0])[0];
+    
+    /* Form Output */
+    sizL[0] = n;
+    sizL[1] = n;
+    plhs[0] = mxCreateNumericArray(2,sizL,mxDOUBLE_CLASS,mxREAL);
+    L = mxGetPr(plhs[0]);
+    sizD[0] = n;
+    sizD[1] = 1;
+    plhs[1] = mxCreateNumericArray(2,sizD,mxDOUBLE_CLASS,mxREAL);
+    D = mxGetPr(plhs[1]);
+    plhs[2] = mxCreateNumericArray(2,sizD,mxINT32_CLASS,mxREAL);
+    P = (int*)mxGetData(plhs[2]);
+    
+    /* Initialize */
+    c = mxCalloc(n*n,sizeof(double));
+    A = mxCalloc(n*n,sizeof(double));
+    
+    for (i = 0; i < n; i++)
+    {
+        P[i] = i;
+        for (j = 0;j < n; j++)
+        {
+            A[i+n*j] = H[i+n*j];
+        }
+    }
+    
+    gamma = 0;
+    for (i = 0; i < n; i++)
+    {
+        L[i+n*i] = 1;
+        c[i+n*i] = A[i+n*i];
+    }
+    
+    /* Compute modification parameters */
+    gamma = -1;
+    xi = -1;
+    for (i = 0; i < n; i++)
+    {
+        gamma = mymax(gamma,absolute(A[i+n*i]));
+        for (j = 0;j < n; j++)
+        {
+            //printf("A(%d,%d) = %f, %f\n",i,j,A[i+n*j],absolute(A[i+n*j]));
+            if (i != j)
+                xi = mymax(xi,absolute(A[i+n*j]));
+        }
+    }
+    delta = mu*mymax(gamma+xi,1);
+    
+    if (n > 1)
+    {
+        beta = sqrt(mymax(gamma,mymax(mu,xi/sqrt(n*n-1))));
+    }
+    else
+    {
+        beta = sqrt(mymax(gamma,mu));
+    }
+    
+    for (j = 0; j < n; j++)
+    {
+        
+    /* Find q that results in Best Permutation with j */
+        maxVal = -1;
+        q = 0;
+        for(i = j; i < n; i++)
+        {
+            if (absolute(c[i+n*i]) > maxVal)
+            {
+                maxVal = mymax(maxVal,absolute(c[i+n*i]));
+                q = i;
+            }
+        }
+        
+        /* Permute D,c,L,A,P */
+        permute(D,j,q);
+        permuteInt(P,j,q);
+        permuteRows(c,j,q,n);
+        permuteCols(c,j,q,n);
+        permuteRows(L,j,q,n);
+        permuteCols(L,j,q,n);
+        permuteRows(A,j,q,n);
+        permuteCols(A,j,q,n);
+        
+        for(s = 0; s <= j-1; s++)
+            L[j+n*s] = c[j+n*s]/D[s];
+        
+        for(i = j+1; i < n; i++)
+        {
+            c[i+j*n] = A[i+j*n];
+            for(s = 0; s <= j-1; s++)
+            {
+                c[i+j*n] -= L[j+n*s]*c[i+n*s];
+            }
+        }
+        
+        theta = 0;
+        if (j < n-1)
+        {
+            for(i = j+1;i < n; i++)
+                theta = mymax(theta,absolute(c[i+n*j]));
+        }
+        
+        D[j] = mymax(absolute(c[j+n*j]),mymax(delta,theta*theta/(beta*beta)));
+        
+        if (j < n-1)
+        {
+            for(i = j+1; i < n; i++)
+            {
+                c[i+n*i] = c[i+n*i] - c[i+n*j]*c[i+n*j]/D[j];
+            }
+        }
+        
+    }
+    
+    for(i = 0; i < n; i++)
+        P[i]++;
+    
+    mxFree(c);
+    mxFree(A);
+}
\ No newline at end of file