Switch to side-by-side view

--- a
+++ b/combinedDeepLearningActiveContour/minFunc/lbfgsC.c
@@ -0,0 +1,115 @@
+#include <math.h>
+#include "mex.h"
+
+/* See lbfgs.m for details! */
+/* This function may not exit gracefully on bad input! */
+
+
+void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
+{
+    /* Variable Declarations */
+    
+    double *s, *y, *g, *H, *d, *ro, *alpha, *beta, *q, *r;
+    int nVars,nSteps,lhs_dims[2];
+    double temp;
+    int i,j;
+    
+    /* Get Input Pointers */
+	
+    g = mxGetPr(prhs[0]);
+    s = mxGetPr(prhs[1]);
+    y = mxGetPr(prhs[2]);
+    H = mxGetPr(prhs[3]);
+    
+    /* Compute number of variables (p), rank of update (d) */
+    
+    nVars = mxGetDimensions(prhs[1])[0];
+    nSteps = mxGetDimensions(prhs[1])[1];
+    
+	/* Allocated Memory for Function Variables */
+    ro = mxCalloc(nSteps,sizeof(double));
+	alpha = mxCalloc(nSteps,sizeof(double));
+	beta = mxCalloc(nSteps,sizeof(double));
+	q = mxCalloc(nVars*(nSteps+1),sizeof(double));
+	r = mxCalloc(nVars*(nSteps+1),sizeof(double));
+	
+    /* Set-up Output Vector */
+    
+    lhs_dims[0] = nVars;
+    lhs_dims[1] = 1;
+    
+    plhs[0] = mxCreateNumericArray(2,lhs_dims,mxDOUBLE_CLASS,mxREAL);
+    d = mxGetPr(plhs[0]);
+    
+    /* ro = 1/(y(:,i)'*s(:,i)) */
+    for(i=0;i<nSteps;i++)
+    {
+        temp = 0;
+        for(j=0;j<nVars;j++)
+        {
+			temp += y[j+nVars*i]*s[j+nVars*i];
+        }
+        ro[i] = 1/temp;
+    }
+	
+	/* q(:,k+1) = g */
+	for(i=0;i<nVars;i++)
+	{
+		q[i+nVars*nSteps] = g[i];
+	}
+
+	for(i=nSteps-1;i>=0;i--)
+	{
+		/* alpha(i) = ro(i)*s(:,i)'*q(:,i+1) */
+		alpha[i] = 0;
+		for(j=0;j<nVars;j++)
+		{
+			alpha[i] += s[j+nVars*i]*q[j+nVars*(i+1)]; 
+		}
+		alpha[i] *= ro[i];
+
+		/* q(:,i) = q(:,i+1)-alpha(i)*y(:,i) */
+		for(j=0;j<nVars;j++)
+		{
+			q[j+nVars*i]=q[j+nVars*(i+1)]-alpha[i]*y[j+nVars*i];
+		}
+	}
+
+	/*  r(:,1) = q(:,1) */
+	for(i=0;i<nVars;i++)
+	{
+		r[i] = H[0]*q[i];
+	}
+
+	for(i=0;i<nSteps;i++)
+	{
+		/* beta(i) = ro(i)*y(:,i)'*r(:,i) */
+		beta[i] = 0;
+		for(j=0;j<nVars;j++)
+		{
+			beta[i] += y[j+nVars*i]*r[j+nVars*i];
+		}
+		beta[i] *= ro[i];
+
+		/* r(:,i+1) = r(:,i) + s(:,i)*(alpha(i)-beta(i)) */
+		for(j=0;j<nVars;j++)
+		{
+			r[j+nVars*(i+1)]=r[j+nVars*i]+s[j+nVars*i]*(alpha[i]-beta[i]);
+		}
+	}
+
+	/* d = r(:,k+1) */
+	for(i=0;i<nVars;i++)
+	{
+		d[i]=r[i+nVars*nSteps];
+	}
+
+	/* Free Memory */
+	
+	mxFree(ro);
+	mxFree(alpha);
+	mxFree(beta);
+	mxFree(q);
+	mxFree(r);
+	
+}