MiGL Tech.

苟利国家生死以,岂因祸福避趋之~

米国梁ID:BoyMgl
23392次访问,排名4737(-2)好友0人,关注者3
开朗乐观,喜欢创造,积极的面对挑战,希望能有一个安逸的环境让我做研究,信息与计算科学本科在读。
BoyMgl的文章
原创 39 篇
翻译 0 篇
转载 0 篇
评论 5 篇
米国梁的公告
Idea + Image + Innovation + Invent = I
最近评论
hfgayy:收藏!
meng_yao:您那有没有关于FTP文件操作的方法或类啊?
小弟不懂这方面的知识。
最好是关于C# 语言 WIN API 方面的。
有的话麻烦您给我讲讲。谢谢!
我会经常看您的BLOG的。
crackoctober:老米在csdn也有号啊,哈哈,今天跑来看看。。。。偶zql
wangyouworld:真是太谢谢朋友了!
文章不错,我收藏了!
wangyouworld:……
祝朋友好运!
文章分类
收藏
    相册
    我画的图
    技术联盟
    iShowing.net
    SJW's World
    vczh的博客
    YouYee.org
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 带状对角矩阵的压缩及乘法运算算法实现收藏

    新一篇: 带状对角矩阵的LU分解及回代求解算法实现 | 旧一篇: 求解三对角系统方程算法实现

    算法名称:带状对角矩阵乘法
     
    带状对角矩阵定义:
           带状对角系统紧靠在对角线左边(下边)有m10个非零元素,紧靠其右边(上边)有m20个非零元素。当然,这仅在m1m2<<N时才有意义。这种情况下,用LU分解求解线性系统可以比通用N×N的情况完成的更快,占用空间更少。
           aij精确定义带状对角矩阵,表示为
    aij = 0 j > i + m2 i > j + m1
    带状对角矩阵用一种称为压缩形式的方式进行存储及操作,把矩阵顺时针旋转45°,是非零元素排成一个细长的矩阵,它有m1+1+m2列和N行。例如,
    其中N=7m1=2m2=1,存储在压缩形式为7×4矩阵
    其中x表示压缩格式中浪费的空间,它们在运算中不被引用,因而其值可随意。
    注:原矩阵对角线元素现在第m1列中,对角线左下的元素在其左侧,对角线右上的元素在其右侧。
     
    运行示例:
    The origin left matrix (before compression):
    3.0 1.0 0.0 0.0 0.0 0.0 0.0
    4.0 1.0 5.0 0.0 0.0 0.0 0.0
    9.0 2.0 6.0 5.0 0.0 0.0 0.0
    0.0 3.0 5.0 8.0 9.0 0.0 0.0
    0.0 0.0 7.0 9.0 3.0 2.0 0.0
    0.0 0.0 0.0 3.0 8.0 4.0 6.0
    0.0 0.0 0.0 0.0 2.0 4.0 4.0
    ----------------------------------
    The new left matrix (after compression):
    0.0 0.0 3.0 1.0
    0.0 4.0 1.0 5.0
    9.0 2.0 6.0 5.0
    3.0 5.0 8.0 9.0
    7.0 9.0 3.0 2.0
    3.0 8.0 4.0 6.0
    2.0 4.0 4.0 0.0
    ----------------------------------
    The right matrix:
    1.0
    2.0
    3.0
    4.0
    5.0
    6.0
    7.0
    ----------------------------------
    Solution matix:
    5.0
    21.0
    51.0
    98.0
    84.0
    118.0
    62.0

     示例程序:

    package com.nc4nr.chapter02.banmul;

    public class BanMul {

        
    double[][] a = {
                
    3.01.00.00.00.00.00.0 },
                
    4.01.05.00.00.00.00.0 },
                
    9.02.06.05.00.00.00.0 },
                
    0.03.05.08.09.00.00.0 },
                
    0.00.07.09.03.02.00.0 },
                
    0.00.00.03.08.04.06.0 },
                
    0.00.00.00.02.04.04.0 }
        }
    ;
        
        
    int anrow = 7,
            m1 
    = 2,    // 对角线下有m1行
            m2 = 1// 对角线上有m2行
        
        
    double[][] ca = new double[7][4];
        
        
    double[][] x = {
                
    {1.0}
                
    {2.0}
                
    {3.0}
                
    {4.0}
                
    {5.0}
                
    {6.0}
                
    {7.0}    
        }
    ;
        
        
    double[] b = new double[anrow];
        
        
    private void cmpban() {
            
    int n = anrow;
            
    for (int i = 0; i < n; i++{
                
    int k = i - m1;
                
    int tmploop = Math.min(m1+m2+1,n - k);
                
    for (int j = Math.max(0-k); j < tmploop; j++) ca[i][j] = a[i][j+k];
            }

        }

        
        
    private void banmul() {
            
    int n = anrow;
            
    for (int i = 0; i < n; i++{
                
    int k = i - m1,
                    tmploop 
    = Math.min(m1+m2+1, n-k);
                b[i] 
    = 0.0;
                
    for (int j=Math.max(0-k); j < tmploop; j++{
                    b[i] 
    += ca[i][j]*x[j+k][0];
                }

            }

            System.out.println(
    "Solution matix:");
            
    for (int i = 0; i < n; i++)
                System.out.println(b[i]);
        }

        
        
    private void output(double[][] a, int nrow, int ncol) {
            
    for (int i = 0; i < nrow; i++{
                String str 
    = "";
                
    for (int j = 0; j < ncol; j++{
                    str 
    += a[i][j] + " ";
                }

                System.out.println(str);
            }

            System.out.println(
    "----------------------------------");
        }

        
        
    public BanMul() {
            System.out.println(
    "The origin left matrix (before compression):");
            output(a,anrow,anrow);
            cmpban();
            System.out.println(
    "The new left matrix (after compression):");
            output(ca,anrow,
    4);
            System.out.println(
    "The right matrix:");
            output(x,anrow,
    1);
            banmul();
        }

        
        
    public static void main(String[] args) {
            
    new BanMul();
        }


    }

    发表于 @ 2007年12月06日 13:36:00|评论(loading...)|编辑

    新一篇: 带状对角矩阵的LU分解及回代求解算法实现 | 旧一篇: 求解三对角系统方程算法实现

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 米国梁