免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3136 | 回复: 5
打印 上一主题 下一主题

牛人帮我看下这个程序计算一个四阶矩阵大概要多久 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-21 11:40 |只看该作者 |倒序浏览
#include<iostream>
#include<exception>
#include<istream>
#include<ostream>
const int N(5);

void input_A(std::istream&data_source,double A[][N],int n);
void matrix_multiply(int n,double A[][N],double B[][N]);
void calculating_L(int n,double L[][N],double A[][N]);
void calculating_U(int n,double U[][N],double L[][N],double A1[][N]);
void output(std:stream&out,double L[][N],int n);

int main(){
        try{
                std::cout<<"请输入矩阵A的阶数:"<<'\n';
                int n(0);
                std::cin>>n;
                if(not std::cin)throw std::exception();
                double A[N][N];
                double A1[N][N];
                double L[N][N];
                double U[N][N];
                input_A(std::cin,A,n);
                for(int i(0);i!=N;++i)
                        for(int j(0);j!=N;++j)
                                A1[j]=A[j];
                std::cout<<"您输入的矩阵A为: \n";
                output(std::cout,A,n);
                calculating_L(n,L,A);
                std::cout<<"得到的矩阵L为: ";
                output(std::cout,L,n);
                std::cout<<'\n';
                calculating_U(n,U,L,A1);
                std::cout<<"得到的矩阵U为: ";
                output(std::cout,U,n);
        }
        catch(...){
                std::cerr<<"\n\n***An exception was thrown.***\n";
        }
}

void input_A(std::istream&in,double A[][N],int n){
        for(int i(0);i!=n;++i){
                for(int j(0);j!=n;++j){
                        std::cout<<"请输入第"<<i<<"行第"<<j<<"列的元素:";
                        in>>A[j];
                        std::cout<<'\n';
                }
        }
}

void matrix_multiply(int n,double A[][N],double B[][N]){
        double c[N][N];
        for(int i(0);i!=n;++i){
                for(int p(0);p!=n;++p){
                        for(int j(0);j!=n;++j){
                                c[p]+=B[j]*A[j][p];
                        }
                }
        }
        for(int i(0);i!=n;++i)
                for(int j(0);j!=n;++j)
                        A[j]=c[j];
}

void calculating_L(int n,double L[][N],double A[][N]){
        for(int i(0);i!=n;++i){
                for(int j(0);j!=n;++j){
                        if(i==j)L[j]=1;
                        else L[j]=0;
                }
        }
        for(int q(0);q!=n;++q){
                for(int p(0);p!=n;++p){
                        while(p>q){
                                L[p][q]=-A[p][q]/A[q][q];
                        }
                }
                matrix_multiply(n,A,L);
        }
        for(int i(0);i!=n;++i){
                for(int j(0);j!=n;++j){
                        while(L[j]<0){
                                L[j]=-1*L[j];
                        }
                }
        }
}

void calculating_U(int n,double U[][N],double L[][N],double A1[][N]){
        matrix_multiply(n,L,A1);
        for(int i(0);i!=n;++i)
                for(int j(0);j!=n;++j)
                        U[j]=L[j];
}

void output(std:stream&out,double L[][N],int n){
        for(int i(0);i!=n;++i){
                for(int j(0);j!=n;++j){
                        out<<L[j]<<" ";
                }
                std::cout<<'\n';
        }
}

[ 本帖最后由 sssntte 于 2007-10-21 22:44 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-10-21 19:35 |只看该作者
这个问题不好回答,计算时间长短与计算机本身有很大的关系, 你是不是说它的时间度呀

论坛徽章:
0
3 [报告]
发表于 2007-10-21 19:43 |只看该作者
可以自己测试啊.使用time命令,或者使用gettimeofday()来计算.

论坛徽章:
0
4 [报告]
发表于 2007-10-21 20:58 |只看该作者
可以计算一下复杂度,楼主说说算法吧,看程序太烦了。

论坛徽章:
0
5 [报告]
发表于 2007-10-21 22:35 |只看该作者
这个程序我做的是矩阵的LU分解
我发现存在未定义的矩阵元素时
如果让该矩阵参与相乘运算
程序似乎会永远运行下去
不解

论坛徽章:
0
6 [报告]
发表于 2007-10-21 22:45 |只看该作者
void calculating_L(int n,double L[][N],double A[][N])
这个函数
望高人指点一下复杂度是否过大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP