| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1077 人关注过本帖
标题:用householder 变换化一般矩阵为hesssenberg矩阵的C程序
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:3 
用householder 变换化一般矩阵为hesssenberg矩阵的C程序
#include "stdio.h"
#include "math.h"
#define n 10
int sign(double x)
{
    int y;
    if(x>0) y=1;
    else if(x<0) y=-1;
    else y=0;
    return(y);
}
void matrix_print(double A[n][n])
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%8.4lf\t",A[i][j]);
            printf("\n");
    }
}
double matrix_norm(double a[n])
{
    int i;
    double d=0;
    for(i=0;i<n;i++)
        d+=a[i]*a[i];
        return(sqrt(d));
}
void matrix_multiply(double A[n][n],double B[n][n],double C[n][n])
{
    int i,j,t;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            C[i][j]=0;
            for(t=0;t<n;t++)
                C[i][j]+=A[i][t]*B[t][j];
        }
}
void matrix_copy(double A[n][n],double B[n][n])
{
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            A[i][j]=B[i][j];
}
void householder_trans(double A[n][n],int k)
{
    double a[n];
    double H[n][n];
    double d=0;
    int i,j;
    for(i=0;i<=k;i++)
        a[i]=0;
    for(i=k+1;i<n;i++)
        a[i]=A[i][k];
        d=matrix_norm(a);
        if(fabs(d)!=fabs(A[k+1][k]))
            a[k+1]+=sign(A[k+1][k])*d;
            d=matrix_norm(a);
            for(i=0;i<n;i++)
                a[i]=a[i]/d;
            printf("%8.4lf\t",d);
             for(i=0;i<n;i++)
             {
                 for(j=0;j<n;j++)
                  
                  H[i][j]=-2*a[i]*a[j];
                      H[i][i]++;
                  }
                  double temp[n][n];
                  printf("H:\n");
                  matrix_print(H);
                  matrix_multiply(H,A,temp);
                  matrix_copy(A,temp);
                  matrix_multiply(A,H,temp);
                  matrix_copy(A,temp);
}
 void  matrix_input(double A[n][n])
  {
      int i,j;
      for(i=0;i<n;i++)
          for(j=0;j<n;j++)
          {
              printf("A[%d][%d]=",i,j);
              scanf("%lf",&A[i][j]);
          }
  }
void main()
{
    int i;
      double A[n][n];
      matrix_input(A);
      printf("A:\n");
      matrix_print(A);
      for(i=0;i<n-2;i++)
          householder_trans(A,i);
          printf("hessenberg is:\n");
          matrix_print(A);
}
搜索更多相关主题的帖子: householder double hesssenberg 矩阵 int 
2008-01-01 00:53
spring4676
Rank: 1
来 自:内蒙古大草原
等 级:新手上路
帖 子:103
专家分:0
注 册:2007-12-10
收藏
得分:0 
用householder 变换化一般矩阵为hesssenberg矩阵的C程序
这个程序能用来干嘛?
2008-01-01 09:08
spring4676
Rank: 1
来 自:内蒙古大草原
等 级:新手上路
帖 子:103
专家分:0
注 册:2007-12-10
收藏
得分:0 
数组求逆
能帮我编一个多维数组求逆的程序吗?
要能计算16位以上
2008-01-01 09:09
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
householder 变换 是用来镜像对称用
2008-01-10 00:41
快速回复:用householder 变换化一般矩阵为hesssenberg矩阵的C程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015139 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved