📄 kltransdlg.cpp
字号:
fprintf(fpt,"%14.6f",mvarTM[i][j]);
}
fprintf(fpt,"%s\n\n"," ");
}
fprintf(fpt,"%s\n","-------------------------------协方差矩阵-------------------------------");
fprintf(fpt,"%s\n","-------------------------------特征向量矩阵-------------------------------");
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
fprintf(fpt,"%14.6f",a[i][j]);
}
fprintf(fpt,"%s\n\n"," ");
}
fprintf(fpt,"%s\n","-------------------------------特征向量矩阵-------------------------------");
fclose(fpt);
CDialog::OnOK();
MessageBox("所选分量的图象和统计的文本文件已按照您指定的路径和文件名写入磁盘,请查看!","提示",
MB_ICONINFORMATION|MB_OK);
}
double CKLTransDlg::getAver(int h, int w, LPSTR lpbits, LONG line)
{
int i,j;
double sum=0;
unsigned char * lpsr;
double GrayTable[256];
for(i=0;i<256;i++)
{
GrayTable[i]=0;
}
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
lpsr=(unsigned char*)(lpbits+line*i+3*j);
GrayTable[*lpsr]++;
}
}
for(i=0;i<256;i++)
{
sum+=GrayTable[i]*i;
}
sum=sum/(double)(h*w);
return sum;
}
double CKLTransDlg::getVar(double aver, int h, int w, LPSTR lpbits, LONG line)
{
int i,j;
double sum=0;
unsigned char * lpsr;
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
lpsr=(unsigned char*)(lpbits+line*i+3*j);
sum+=(*lpsr-aver)*(*lpsr-aver);
}
}
sum=sum/(double)(h*w);
return sum;
}
double CKLTransDlg::getVari(double aver1,double aver2, LPSTR lpbits1, LPSTR lpbits2,
LONG line, int h, int w)
{
int i,j;
double sum=0;
unsigned char * lpsr1;
unsigned char * lpsr2;
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
lpsr1=(unsigned char*)(lpbits1+line*i+3*j);
lpsr2=(unsigned char*)(lpbits2+line*i+3*j);
sum+=(*lpsr1-aver1)*(*lpsr2-aver2);
}
}
sum=sum/(double)(h*w);
return sum;
}
void CKLTransDlg::cstrq(double *a, int n, double *q, double *b, double *c)
{
int i,j,k,u;
double h,f,g,h2;
for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
{ u=i*n+j; q[u]=a[u];}
for (i=n-1; i>=1; i--)
{ h=0.0;
if (i>1)
for (k=0; k<=i-1; k++)
{ u=i*n+k; h=h+q[u]*q[u];}
if (h+1.0==1.0)
{ c[i]=0.0;
if (i==1) c[i]=q[i*n+i-1];
b[i]=0.0;
}
else
{ c[i]=sqrt(h);
u=i*n+i-1;
if (q[u]>0.0) c[i]=-c[i];
h=h-q[u]*c[i];
q[u]=q[u]-c[i];
f=0.0;
for (j=0; j<=i-1; j++)
{ q[j*n+i]=q[i*n+j]/h;
g=0.0;
for (k=0; k<=j; k++)
g=g+q[j*n+k]*q[i*n+k];
if (j+1<=i-1)
for (k=j+1; k<=i-1; k++)
g=g+q[k*n+j]*q[i*n+k];
c[j]=g/h;
f=f+g*q[j*n+i];
}
h2=f/(h+h);
for (j=0; j<=i-1; j++)
{ f=q[i*n+j];
g=c[j]-h2*f;
c[j]=g;
for (k=0; k<=j; k++)
{ u=j*n+k;
q[u]=q[u]-f*c[k]-g*q[i*n+k];
}
}
b[i]=h;
}
}
for (i=0; i<=n-2; i++) c[i]=c[i+1];
c[n-1]=0.0;
b[0]=0.0;
for (i=0; i<=n-1; i++)
{ if ((b[i]!=0.0)&&(i-1>=0))
for (j=0; j<=i-1; j++)
{ g=0.0;
for (k=0; k<=i-1; k++)
g=g+q[i*n+k]*q[k*n+j];
for (k=0; k<=i-1; k++)
{ u=k*n+j;
q[u]=q[u]-g*q[k*n+i];
}
}
u=i*n+i;
b[i]=q[u]; q[u]=1.0;
if (i-1>=0)
for (j=0; j<=i-1; j++)
{ q[i*n+j]=0.0; q[j*n+i]=0.0;}
}
return;
}
int CKLTransDlg::csstq(int n, double *b, double *c, double *q, double eps, int l)
{
int i,j,k,m,it,u,v;
double d,f,h,g,p,r,e,s;
c[n-1]=0.0; d=0.0; f=0.0;
for (j=0; j<=n-1; j++)
{ it=0;
h=eps*(fabs(b[j])+fabs(c[j]));////////////////////////
if (h>d) d=h;
m=j;
while ((m<=n-1)&&(fabs(c[m])>d)) m=m+1;
if (m!=j)
{ do
{ if (it==l)//
{ printf("fail\n");
return(-1);
}
it=it+1;
g=b[j];
p=(b[j+1]-g)/(2.0*c[j]);
r=sqrt(p*p+1.0);
if (p>=0.0) b[j]=c[j]/(p+r);
else b[j]=c[j]/(p-r);
h=g-b[j];
for (i=j+1; i<=n-1; i++)
b[i]=b[i]-h;
f=f+h; p=b[m]; e=1.0; s=0.0;
for (i=m-1; i>=j; i--)
{ g=e*c[i]; h=e*p;
if (fabs(p)>=fabs(c[i]))
{ e=c[i]/p; r=sqrt(e*e+1.0);
c[i+1]=s*p*r; s=e/r; e=1.0/r;
}
else
{ e=p/c[i]; r=sqrt(e*e+1.0);
c[i+1]=s*c[i]*r;
s=1.0/r; e=e/r;
}
p=e*b[i]-s*g;
b[i+1]=h+s*(e*g+s*b[i]);
for (k=0; k<=n-1; k++)
{ u=k*n+i+1; v=u-1;
h=q[u]; q[u]=s*q[v]+e*h;
q[v]=e*q[v]-s*h;
}
}
c[j]=s*p; b[j]=e*p;
}
while (fabs(c[j])>d);
}
b[j]=b[j]+f;
}
for (i=0; i<=n-1; i++)
{ k=i; p=b[i];
if (i+1<=n-1)
{ j=i+1;
while ((j<=n-1)&&(b[j]<=p))
{ k=j; p=b[j]; j=j+1;}
}
if (k!=i)
{ b[k]=b[i]; b[i]=p;
for (j=0; j<=n-1; j++)
{ u=j*n+i; v=j*n+k;
p=q[u]; q[u]=q[v]; q[v]=p;
}
}
}
return(1);
}
void CKLTransDlg::OnCheck7()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_n[6]==0)
{
m_n[6]=1;
GetDlgItem(IDC_FENLIANG7)->EnableWindow(true);
GetDlgItem(IDC_BROWSE17)->EnableWindow(true);
GetDlgItem(IDC_CHECKALL)->EnableWindow(false);
}
else if(m_n[6]==1)
{
m_n[6]=0;
GetDlgItem(IDC_FENLIANG7)->EnableWindow(false);
GetDlgItem(IDC_BROWSE17)->EnableWindow(false);
}
}
void CKLTransDlg::OnBrowse17()
{
// TODO: Add your control notification handler code here
static char BASED_CODE file[]="BMP Files(*.BMP)|*.bmp|所有文件(*.*)||";
CFileDialog Select(FALSE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,file,NULL);
Select.DoModal();
CString FileName;
FileName=Select.GetPathName();
m_strFenliang7=FileName;
UpdateData(false);
}
double CKLTransDlg::getShang(int h, int w, LPSTR lpbits, LONG line)
{
double pArray[256];
int i,j;
double sum;
sum=0;
unsigned char * lpsr;
for(i=0;i<256;i++)
{
pArray[i]=0;
}
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
lpsr=(unsigned char*)(lpbits+line*i+3*j);
pArray[*lpsr]++;
}
}
for(i=0;i<256;i++)
{
pArray[i]/=(h*w);
}
for(i=0;i<256;i++)
{
sum+=(-pArray[i]*log(pArray[i])/log(2));
}
return sum;
}
int CKLTransDlg::eejcb(double a[], int n, double v[], double eps, int jt)
{
int i,j,p,q,u,w,t,s,l;
double fm,cn,sn,omega,x,y,d;
l=1;
for (i=0; i<=n-1; i++)
{
v[i*n+i]=1.0;
for (j=0; j<=n-1; j++)
{
if (i!=j)
{
v[i*n+j]=0.0;
}
}
}
while (1==1)
{
fm=0.0;
for (i=0; i<=n-1; i++)
{
for (j=0; j<=n-1; j++)
{
d=fabs(a[i*n+j]);
if ((i!=j)&&(d>fm))
{
fm=d;
p=i;
q=j;
}
}
}
if (fm<eps)
{
return(1);
}
if (l>jt)
{
return(-1);
}
l=l+1;
u=p*n+q;
w=p*n+p;
t=q*n+p;
s=q*n+q;
x=-a[u];
y=(a[s]-a[w])/2.0;
omega=x/sqrt(x*x+y*y);
if (y<0.0)
{
omega=-omega;
}
sn=1.0+sqrt(1.0-omega*omega);
sn=omega/sqrt(2.0*sn);
cn=sqrt(1.0-sn*sn);
fm=a[w];
a[w]=fm*cn*cn+a[s]*sn*sn+a[u]*omega;
a[s]=fm*sn*sn+a[s]*cn*cn-a[u]*omega;
a[u]=0.0;
a[t]=0.0;
for (j=0; j<=n-1; j++)
{
if ((j!=p)&&(j!=q))
{
u=p*n+j;
w=q*n+j;
fm=a[u];
a[u]=fm*cn+a[w]*sn;
a[w]=-fm*sn+a[w]*cn;
}
}
for (i=0; i<=n-1; i++)
{
if ((i!=p)&&(i!=q))
{
u=i*n+p;
w=i*n+q;
fm=a[u];
a[u]=fm*cn+a[w]*sn;
a[w]=-fm*sn+a[w]*cn;
}
}
for (i=0; i<=n-1; i++)
{
u=i*n+p;
w=i*n+q;
fm=v[u];
v[u]=fm*cn+v[w]*sn;
v[w]=-fm*sn+v[w]*cn;
}
}
return(1);
}
void CKLTransDlg::OnExitdlg()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
void CKLTransDlg::OnTips()
{
// TODO: Add your control notification handler code here
MessageBox("请依次选择待输入的同一TM图象的6个波段图象文件,然后设定输出路径和文件名,然后点 确定 进行处理!");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -