用C语言代码算距离。

Signed-off-by: facat@lab.com <facat@lab.com>
This commit is contained in:
facat@lab.com 2014-12-08 16:54:42 +08:00
parent 3cb6bfe094
commit 193f02f4d7
4 changed files with 71 additions and 3 deletions

4
.gitignore vendored
View File

@ -1 +1,3 @@
*.asv
*.asv
*.mexw32
*.mat

62
UserSum.c Normal file
View File

@ -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;i<Alen;i++)
{
sum+=pow(dataA[i]-dataB[i],2);
}
sum=sqrt(sum);
pSum=mxCreateScalarDouble(sum);
if(nlhs>0)
{
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;
}

5
main.m
View File

@ -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;

View File

@ -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