24小时热门版块排行榜    

CyRhmU.jpeg
查看: 294  |  回复: 3
当前主题已经存档。

wanggongming

铁虫 (小有名气)

[交流] 【求助】如何求解高精度double型矩阵的秩

求矩阵秩常用的方法是全选主元高斯消去法,我在徐士良的《C常用算法程序集(第二版)》中看到过C语言源代码,但是这个代码无法求解Double型高精度
矩阵(即每个元素的精度都在小数点6位之后)的秩!
有一个一个矩阵,其第一行和第二行元素完全相同(如下所示,由于两行完全相同,只列出第一行),从原理上说秩应该是1。但是求出的秩却是2。
0.288488
-0.010170
-0.007254
0.033046
-0.111335
0.308060
-0.424541
0.317609
-0.159026
0.042474
0.005092
0.000000
.005092
-0.042474
-0.159026
-0.317609
-0.424541
-0.308060
-0.111335
-0.033046
-0.007254
0.010170
0.288488
究其原因,应该是Double型矩阵进行高斯消元时,不好消成某行全为0的形式,所以导致求秩错误!
对于这种情况下的矩阵,不知谁有办法求出它的秩,望高手给予帮助!

[ Last edited by wenzhenzhong on 2008-12-4 at 23:38 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wanggongming

铁虫 (小有名气)

★ ★
wenzhenzhong(金币+2,VIP+0):辛苦了,~~
下面是徐士良书中矩阵求秩的代码,它可以求出某些Double型矩阵的秩,但是对于精度特别高的Double型矩阵无能为力!
#include "math.h"
long brank(double ** a, long m, long n)
{
        int i,j,k,nn,is,js,l,ll,u,v;
        double q,d;
        nn=m;
        if(m>=n)
                nn=n;
        k=0;
        for(l=0;l<=nn-1;l++)
        {
                q=0.0;
                for(i=l;i<=m-1;i++)
                        for(j=l;j<=n-1;j++)
                        {
                                d=fabs(a[j]);
                                if(d>q)
                                {
                                        q=d;
                                        is=i;
                                        js=j;
                                }
                        }
                if(q+1.0==1.0)
                        return(k);
                k=k+1;
                if(is!=l)
                {
                        for(j=l;j<=n-1;j++)
                    {
                                d=a[l][j];
                                a[l][j]=a[is][j];
                                a[is][j]=d;
                        }
                }
                if(js!=l)
                {
                        for(i=l;i<=m-1;i++)
                    {
                                d=a[js];
                                a[js]=a[l];
                                a[l]=d;
                        }
                }
                for(i=l+1; i<=n-1; i++)
                {
                        d=a[l]/a[l][l];
                        for(j=l+1; j<=n-1; j++)
                        {
                                a[j]=a[j]-d*a[l][j];
                        }
                }
        }
        return(k);
}
2楼2008-12-04 20:38:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yalefield

金虫 (文坛精英)

老汉一枚


wenzhenzhong(金币+1,VIP+0):欢迎常来理工版~~
把全部阵元放大1百万倍
3楼2008-12-05 10:04:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wanggongming

铁虫 (小有名气)

100万倍,赫赫,用不着那么大吧!
4楼2008-12-11 23:04:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 wanggongming 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见