📄 lms.cpp
字号:
#include "stdio.h"
#include "string.h"
#include "malloc.h"
#include "eigen.h"
float **R_matr(float **, int , int );
void lms(int , int , float *, float *, float **);
float stdy_rate =0;
void main(void)
{
int i,k;
float R[3][3];
float eigen[3];
float max_eigen;
float W[3] ={0,0,0};
float b =1;
float p[2][3]={
{1,-1,-1},
{1,1,-1}
};
float t[2] ={-1,1};
memcpy(R, R_matr((float **)p, 3, 2), 4*3*3);
symeigen(eigen, (float **)R, 3);
max_eigen =eigen[0];
stdy_rate =1/max_eigen;
for (k=0; k<1000; k++)
{
for (i=0; i<2; i++)
{
lms(1, 3, &p[i][0], (float *)(t+i), (float **)W);
}
}
for (i=0; i<3; i++)
{
printf("%f ", W[i]);
}
}
/***************************************************
build related matrix R
***************************************************/
float **R_matr(float **z, int R, int n)
{
float **rslt =NULL;
int i,j,k;
if ( R<=0 && n<=0)
{
return NULL;
}
rslt =(float **)malloc(4*R*R);
memset(rslt, 0, 4*R*R);
for (k=0; k<n; k++)
{
for (i=0; i<R; i++)
{
for (j=0; j<R; j++)
{
*(float *)(rslt+i*R+j) +=( ( *(float *)(z+k*R+i) ) * ( *(float *)(z+k*R+j) ) );
}
}
}
for (i=0; i<R; i++)
{
for (j=0; j<R; j++)
{
*(float *)(rslt+i*R+j) /=n;
}
}
return rslt;
}
/***************************************************************
ADALINE using LMS arithmetic
****************************************************************/
void lms(int S, int R, float *P, float *t, float **W)
{
int i,j;
float *Wp_temp =(float *)malloc(4*S);
float *e =(float *)malloc(4*S);
float sum =0;
/*****************************************************************/
//function of this sect is "Wp+b"
for (i=0; i<S; i++)
{
sum =0;
for (j=0; j<R; j++)
{
// printf("%f\n",*(float *)(P +j));
sum +=(*(float *)(W+ i*R+ j)) * (*(float *)(P +j));
}
*(Wp_temp +i) =sum;
}
/*
for (i=0; i<S; i++)
{
*(Wp_temp +i) += *(b +i);
}
*/
/***********************************************************************/
for (i=0; i<S; i++)
{
*(e +i)=*(t +i) - *(Wp_temp+ i); //purlin() function, a=Wp+b, e=t-a
}
for (i=0; i<S; i++)
{
for (j=0; j<R; j++)
{
*(float *)( W+ i*R+ j ) += ( 0.5*stdy_rate * ( *(e +i) ) * ( *( P +j ) ) );
//printf("%f\n", *(float *)( W+ i*R+ j ));
}
//*( b+i ) += *( e+i );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -