创建博客 登录  
 加关注
   显示下一条  |  关闭

(((silence)))

#define if(...) if(!(__VA_ARGS__))

 
 
 

日志

 
 

通过将矩阵转换为上三角形式求其行列式的值  

2010-01-01 19:06:17|  分类: 默认分类 |  标签: |字号 订阅

当年上大一的时候刚学到行列式的概念,草草的写过一个通过行列分解求行列式的值的程序;后来有不止一个学弟问过我“怎么求行列式的值啊?”

我便想起当年的事迹,建议道,行列分解很容易写的,你肯定可以搞定。

回想起来,这样的说法太具有误导性了——行列分解的复杂度太高了,无论是空间上还是时间上,非常不可取,非常、非常不可取。

 

So,下面是通过将矩阵转换为上三角形式求行列式的值的方法:

//依赖项:向量和矩阵类

 

// Author: IF

// License: BSD

double determinant( NA::MatDP const& m )
{
    NA_ASSERT(m.rows()==m.cols());
    NA::MatDP mat(m);
    double    d = 1;
    int       i,j,k,n = m.rows();

    for( i=0; i<n; ++i ) {
        double largest=fabs(mat[i][i]);
        int    largestAtRow=i;
        // 选取主元
        for ( j=i+1; j<n; ++j ) {
            if ( fabs(mat[j][i]) > largest ) {
                largest = fabs(mat[j][i]);
                largestAtRow = j;
            }
        }
        if ( largest < 1e-20 ) // 0
            return 0;
        // 行交换
        if ( largestAtRow != i ) {
            mat.swapRow ( i, largestAtRow );
            d = -d;
        }
        // 消去
        for ( j=i+1; j<n; ++j ) {
            double factor = mat[j][i]/mat[i][i];
            mat[j][i]=0;
            for ( k = i+1; k<n; ++k ) {
                mat[j][k] -= mat[i][k]*factor;
            }
        }
    }
    // 计算行列式
    for ( i=0; i<n; ++i ) {
        d *= mat[i][i];
    }

    return d;
}

 

// 测试:

int main()
{
    double pm[]= {
        1, 5, 5,
        3, 2, 2,
        5, 5, 8
    };
    NA::MatDP m(pm, 3,3);
    cout<<determinant(m)<<endl;
    return 0;
}

  评论这张
转发至微博
转发至微博
0   分享到:        
阅读(304)| 评论(0)| 不可引用 |举报

历史上的今天

相关文章

最近读者

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--相关文章--> <#--历史上的今天--> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012