zoukankan      html  css  js  c++  java
  • 改写UMFPACK算例中的压缩方式(静态)

    在之前版本 改写UMFPACK算例中的压缩方式(动态) 中Ai Ax采用的是vector类型,现在修改为int和double,牺牲内存空间

    View Code
    //Data:2013-2-24
    //修改了Ai Ax的类型 利用最大维数n*n来保存,可以调用正确结果 不过不知系统随机分配的值 函数没有用
    #include <stdio.h>
    #include <math.h>
    #include "umfpack.h"
    
    #pragma comment(lib,"../lib/libamd.lib")
    #pragma comment(lib,"../lib/libatlas.lib")
    #pragma comment(lib,"../lib/libf77blas.lib")
    #pragma comment(lib,"../lib/libg2c.lib")
    #pragma comment(lib,"../lib/libgcc.lib")
    #pragma comment(lib,"../lib/libumfpack.lib")                                           
    //上面几行也可以通过定义静态库的路径来实现
    int main (void)
    {
        int n=5;
        double *null =(double *)NULL ;
        void *Symbolic, *Numeric ;
        int i,j;
    
    /*    
        //定义矩阵A
        int **A=new int *[n];
        for(j=0;j<n;j++)
            A[j]= new int[n];
    
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                scanf("%d",&A[i][j]);
    */
        int A[5][5]={
            {2, 3, 0, 0, 0},
            {3, 0, 4, 0, 6},
            {0,-1,-3, 2, 0},
            {0, 0, 1, 0, 0},
            {0, 4, 2, 0, 1}
        };
    
        int *Ap=new int [n+1];
        Ap[0]=0;
    
        int *Ai=new int[n*n];
        for(i=0;i<n*n;i++)
            Ai[i]=1;
        double *Ax=new double[n*n];
        for(i=0;i<n*n;i++)
            Ax[i]=1;
        double epsilon=0.00001;
        int NZnum=0;//矩阵非零元的个数
    
        int k=0,l=0,m=0;
        for(j=0;j<n;j++)
        {
            for(i=0;i<n;i++)
            {
                if(abs(A[i][j])>epsilon)
                {
                    Ai[l++]=i;
                    Ax[m++]=A[i][j];
    
                    NZnum++;
                }
            }
            Ap[k+1]=NZnum;
            k++;
        }
        Ap[n]=NZnum;
        printf("--Ai---\n");
        for (int i=0; i<n*n; i++)
        {
            printf("%d ", Ai[i]);
        }
        printf("\n");
        double b [ ] = {8., 45., -3., 3., 19.} ;
        double *x=new double[n];
        
        umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null);
        umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ;
        umfpack_di_free_symbolic (&Symbolic);
        umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null);
        umfpack_di_free_numeric (&Numeric) ;
    
        for(i=0;i<n;i++) 
            printf("x[%d]=%g\n", i, x[i]) ;
    
    
        return 0;
    }

    结果显示如下:

    此处正常的Ai只有12个 后面如果是系统赋值的话 很乱。这个地方赋初值,主要检查是否在值恰当的时候,可以为正常结果。

  • 相关阅读:
    迭代器基础知识
    C语言I博客作业09
    第一周作业
    C语言1博客作业04
    C语言I博客作业08
    C语言博客作业05
    C语言I作业12—学期总结
    C语言I博客作业10
    C语言I博客作业06
    C语言I博客作业11
  • 原文地址:https://www.cnblogs.com/kmliang/p/2932022.html
Copyright © 2011-2022 走看看