求矩阵特征值与特征向量的全部代码!偶快崩溃了,该怎么解决

求矩阵特征值与特征向量的全部代码!!偶快崩溃了
这个东西太BT

------解决方案--------------------
。。。。。。?
------解决方案--------------------
不会 帮顶
------解决方案--------------------

//求实对称矩阵的特征值及特征向量的雅格比法
//利用雅格比(Jacobi)方法求实对称矩阵的全部特征值及特征向量
//返回值小于0表示超过迭代jt次仍未达到精度要求
//返回值大于0表示正常返回
//a-长度为n*n的数组,存放实对称矩阵,返回时对角线存放n个特征值
//n-矩阵的阶数
//u-长度为n*n的数组,返回特征向量(按列存储)
//eps-控制精度要求
//jt-整型变量,控制最大迭代次数
int 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;
// 初始化 特征向量矩阵, 使其全为0
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++) // 找出,矩阵a(特征值),中除对角线外 其他元素的最大绝对值
{ // 这个最大值是位于a[p][q] ,等于 fm
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; // x y的求法不同
omega=x/sqrt(x*x+y*y); //sin2θ
// tan2θ= x / y = -2.0 * a[u] / (a[s]-a[w])
if (y <0.0)
{
omega=-omega;
}
sn=1.0+sqrt(1.0-omega*omega);
sn=omega/sqrt(2.0*sn);// sinθ
cn=sqrt(1.0-sn*sn); // cosθ

fm=a[w]; // 变换前的a[w] a[p][p]
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;

// 一下是旋转矩阵,旋转了了p行,q行,p列,q列
// 但是四个特殊点没有旋转(这四个点在上述语句中发生了变化)
// 其他不在这些行和列的点也没变
// 旋转矩阵,旋转p行和q行
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;
}
}

// 旋转矩阵,旋转p列和q列
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);
}
------解决方案--------------------
以前写过..但是都忘记了
------解决方案--------------------