Algorithm 版 (精华区)

发信人: Lerry (想不开·撞树), 信区: Algorithm
标  题: [合集]谁能推荐一种算矩阵秩的算法?
发信站: 哈工大紫丁香 (2002年09月15日21:52:37 星期天), 站内信件


────────────────────────────────────────
 Systems (Systems)                    于 2002年09月10日20:03:18 星期二 说道:

谢谢

────────────────────────────────────────
 fobcaesar (温泉企鹅)〓(缥缈的金星)   于 2002年09月10日21:56:56 星期二 说道:

matlab里面有

────────────────────────────────────────
 Systems (Systems)                    于 2002年09月11日09:09:28 星期三 说道:

我手边没有MATLAB,而且我要自己编程算

────────────────────────────────────────
 xiong (矿泉水有益健康)               于 2002年09月11日10:58:38 星期三 说道:

高斯消去不行么

────────────────────────────────────────
 Systems (Systems)                    于 2002年09月11日15:19:01 星期三 说道:

试试看吧,好象效率不高

────────────────────────────────────────
 Systems (Systems)                    于 2002年09月11日15:22:07 星期三 说道:

如果主对角线上某个元素是0怎么办呢?

────────────────────────────────────────
 xiong (矿泉水有益健康)               于 2002年09月11日16:17:59 星期三 说道:

如果a[i][i]=0,进行行初等变换,寻找a[k][i]!=0(i<k<=n),交换i和k行,再依次消去i
行i列的下方元素成上三角阵

────────────────────────────────────────
 Systems (Systems)                    于 2002年09月12日09:26:33 星期四 说道:

done!!!真麻烦呀,把源代码列出来:)
//Rank of a matrix.
long rank(const Matrix &rhs)
{
 long m = rhs.get_m();
 long n = rhs.get_n();
 if(m == 1 && n == 1 && rhs.get_e()[0] != 0)
 {
    return 1;
 }
 if(m == 1 && n == 1 && rhs.get_e()[0] == 0)
 {
    return 0;
 }
 Matrix c;
 if(m <= n)
 {
    c = rhs;
 }
 else
 {
    c = rhs.transp();
    m = rhs.get_n();
    n = rhs.get_m();
 }
 long rank = m;
 double theta = 1e-6;
 int flag = 0;
 for(long r = 0; r < m; r++)
 {
    double rr = c.get_e()[r * n + r];
    if(fabs(rr) <= theta && r < (m - 1))
    {
        flag = 1;
        for(long l = r; l < m && flag == 1; l++)
        {
            for(long k = r; k < n && flag == 1; k++)
            {
                if(c.get_e()[l * n + k] > theta && l != k)
                {
                    rr = c.get_e()[l * n + k];
                    flag = 0;
                    c.rchange((r + 1), (l + 1));
                                        c.cchange((r + 1), (k + 1));
                }
                        }
                }
    }
    if(flag == 1)
    {
                return r;
    }
    if(fabs(rr) <= theta && r == (m - 1))
    {
        return r;
        }
    for(long q = 0; q < n; q++)
    {
        c.get_e()[r * n + q] =  c.get_e()[r * n + q]/rr;
    }
    for(long u = r; u < (m - 1); u++)
        {
        double pp = c.get_e()[(u + 1) * n + r];
        for(long w = 0; w < n; w++)
        {
            c.get_e()[(u + 1) * n + w] = c.get_e()[(u + 1) * n + w] - 
c.get_e()[r * n
 + w] * pp;
        }
    }
 }
 return rank;
}
//其中有一些是我编的矩阵类中的方法
 【 在 xiong (矿泉水有益健康) 的大作中提到: 】

────────────────────────────────────────
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:1.404毫秒