Как преобразовать LaGenMatDouble в LaSymmBandMatDouble Matrix и обратно? - PullRequest
0 голосов
/ 06 июля 2011

Я пытаюсь преобразовать плотную матрицу в матрицу Band и обратно, со ссылкой из http://www.netlib.org/lapack/lug/node124.html

Но когда я проверяю вывод матрицы, используя cout<<matrix<<endl,

это не кажется правильным.

    int n = 5;
    int kl = 2;//subdiag(klower)
    int ku = 1;//superdiag(kupper)
    int p = kl+ku+1;

    LaSymmBandMatDouble A(n,p);
    double arrA[]={  10,     1,     0,     0,     0,
                     1,    10,     1,     0,     0,
                     1,     1,    10,     1,     0,
                     0,     1,     1,    10,     1,
                     0,     0,     1,     1,    10};
    LaGenMatDouble mA(arrA,n,n);
    Mat_to_SymmBandMat(mA,A,n,kl,ku);

, где

void Mat_to_SymmBandMat(LaGenMatDouble &A, LaSymmBandMatDouble &AB, int n, int subdiag, int superdiag)
{
    int u,v,ku,kl;
    ku=superdiag;
    kl=subdiag;

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i>max(1,j-ku) && i<min(n,j+kl)){
                u = ku+1+i-j;
                v = j;
                AB(u,v)=A(i,j);
            }
        }
    }
}


void SymmBandMat_to_Mat(LaSymmBandMatDouble &AB, LaGenMatDouble &A, int n, int subdiag, int superdiag)
{
    int u,v,ku,kl;
    ku=superdiag;
    kl=subdiag;

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i>max(1,j-ku) && i<min(n,j+kl)){
                u = ku+1+i-j;
                v = j;
                A(i,j)=AB(u,v);
            }
        }
    }
}

выход:

A=  //the original matrix
10  1  1  0  0
1  10  1  1  0
0  1  10  1  1
0  0  1  10  1
0  0  0  1  10

AB=  //reading directly from AB
0 0 0 0 0 
0 0 0 1 0 
0 0 10 10 10 
0 1 10 1 0 
0 0 10 0 0 

A=   //converting AB back to A
0  0  0  0  0
0  0  0  0  0
0  1  10  0  0
0  0  10  10  0
0  0  0  1  10

Что может быть не так?

...