diff --git a/.gitignore b/.gitignore index 21229f7..21649bb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -*.asv \ No newline at end of file +*.asv +*.mexw32 +*.mat \ No newline at end of file diff --git a/UserSum.c b/UserSum.c new file mode 100644 index 0000000..b7f0e25 --- /dev/null +++ b/UserSum.c @@ -0,0 +1,62 @@ +#include "mex.h" +#include "math.h" +typedef unsigned int size_t; + +void mexFunction(int nlhs, mxArray* plhs[],int nrhs, const mxArray* prhs[]) +{ + size_t Alen=0; + size_t Blen=0; + size_t i=0; + double *dataA=NULL; + double *dataB=NULL; + double sum=0; + mxArray *pSum=NULL; + if(nrhs<2) + { + mexPrintf("parameters are fewer than 2\n"); + plhs=NULL; + nlhs=0; + return; + } + Alen=length(prhs[0]); + Blen=length(prhs[1]); + if(Alen!=Blen) + { + mexPrintf("dim of para inconsists.\n"); + return; + } +// mexPrintf("A %d B %d\n",Alen,Blen); + dataA=mxGetPr(prhs[0]); + dataB=mxGetPr(prhs[1]); +// mexPrintf("%f\n",dataA[0]); + for(i=0;i0) + { + plhs[0]=pSum; + } + else + { + mexPrintf("must have at least one out para.\n"); + return; + } + +} + +size_t length(const mxArray* p) +{ + size_t m=0; + size_t n=0; + m=mxGetM(p); + n=mxGetN(p); + if(m>n) + { + return m; + } + return n; +} + diff --git a/main.m b/main.m index d9123b4..a32ef0c 100644 --- a/main.m +++ b/main.m @@ -44,6 +44,7 @@ for clusterI=1:clusterN-1 % distanceIJ=sum((d-data(:,cddtI)).^2).^.5; distanceIJ=metricFun( d,data(:,cddtI) ); +% distanceIJ_t=UserSum(d,data(:,cddtI)); Cij=Cij+max([minD-distanceIJ,0]); end maxG(cluster)=Cij; @@ -73,13 +74,15 @@ while 1 if J==cadSetS(I) continue end + matDistance=repmat(d,1,length(SetS)); minD=matDistance-data(:,SetS); minD=diag(minD'*minD).^.5; minD_t=min(minD); minD(minD==minD_t)=1e20; min2D=min(minD); - minD=minD_t; + minD=minD_t; + % distanceIJ=sum((d-data(:,cadUSetS(H))).^2).^.5;%S(I)ÒѾ­µÈÓÚU(H) distanceIJ=metricFun( d,data(:,cadUSetS(H)) ); % distanceHJ=sum((d-data(:,cadSetS(I))).^2).^.5; diff --git a/metricFun.m b/metricFun.m index 708660e..a97a59d 100644 --- a/metricFun.m +++ b/metricFun.m @@ -1,6 +1,7 @@ function [ output_args ] = metricFun( a,b ) -output_args=sum((a-b).^2).^.5; +% output_args=sum((a-b).^2).^.5; % output_args=(a-b)'*(a-b); % output_args=sum(abs(a-b)); +output_args=UserSum(a,b); end