Форум программистов, компьютерный форум, киберфорум
Наши страницы
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
piande
4 / 4 / 2
Регистрация: 26.10.2012
Сообщений: 25
1

Обратить разреженных симметричных матриц

18.02.2014, 22:31. Просмотров 250. Ответов 0
Метки нет (Все метки)

Здравствуйте,
У меня есть следующая задача: развести симметричную матрицу уплотняется распространение Cathill-McKee, расположенный в группе выше главной диагонали, только ненулевой каскадной зоне. Фортран код работает как начало массивов составляет 1. Код на С + + и запустить массив 0.
Я не могу понять, где находится ошибка, пожалуйста, помогите?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//***************************************************************************************************
// Метод на Гаус-Ханзен, Едноврееменно редуциране по редове
// Входни параметри:
// PosDiag - индекс на диагоналните елементи
// A - стъпаловидна триъгълна матрица, подредена в лента [1..m*n]
// само не нулеви елеменди на дясно то главния диагонал
// F - матрица стълб на свободните членове
// Изходни параметри:
// A - обърната матрица,    N * Q = E, Gauss-Hansen method N*X=F
// Резултат:
// Q - обратна матрица, подредена в лента
//***************************************************************************************************
bool GeoNet::InverseGJ(vector <unsigned long>PosDiag, vector <double> &A, vector <double> &F)   // Връща обратна матрица и неизвестни
{       // N * X = F, Gauss-Hansen method
    vector <double> AD;     // помощна матрица
    long i, l, li, j, i1, k, lki, m, mjk, n, lnm, N1, nk, lk, ns, ij;
    N1 = F.size() - 2;
    long N11 = F.size()-1;                          // N11=N1+1
    double d, SumPFF = F[N11];                      // SPFF=FS(N11)
    AD.resize(A.size(), 0);
 
    for (i=0; i<N1; i++)        // -1 ???           // DO 5 I=1,N1
    {
        l = PosDiag[i];                             // L=MH(I)              // индекс на диагоналем елемент
        li = l - i;                                 // LI=L-I               // с това получава индекс на колонката
        j = PosDiag[i+1] - li - 1;                  // J=MH(I+1)-LI-1
        A[l] = 1./A[l];                             // RN(L)=1./RN(L)
        F[N11]-= F[i]*F[i]*A[l];                    // FS(N11)=FS(N11)-FS(I)**2*RN(L)
        i1 = i + 1;                                 //  I1=I+1
        if (i1>j) //continue;                           // IF(I1.GT.J)GO TO 5
        {
            F[i]*= A[l];                                //5 FS(I)=FS(I)*RN(L)
            continue;
        }
        for (k=i1; k<=j; k++)                       // DO 6 K=I1,J
        {
            lki = li + k;                           // LKI=LI+K
            m = PosDiag[k];                         // M=MH(K)
            d = A[lki]*A[l];                        // D=RN(LKI)*RN(L)
            F[k]-= F[i]*d;                          // FS(K)=FS(K)-FS(I)*D
            mjk = m + j - k;                        // MJK=M+J-K
            for (n=m; n<=mjk; n++)                  // DO 8 N=M,MJK
            {
                lnm = lki + n - m;                  // LNM=LKI+N-M
                A[n]-= A[lnm]*d;                    //8 RN(N)=RN(N)-RN(LNM)*D
            }
            A[lki] = d;                             //6 RN(LKI)=D
        }
        F[i]*= A[l];                                //5 FS(I)=FS(I)*RN(L)
    }
// Обратен ход
    for (i=N1-2; i>=0; i--)                         // I=N1
    {                                               // 9 I=I-1
        l = PosDiag[i];                             // L=MH(I)
        nk = PosDiag[i+1] - l - 1;                  // NK=MH(I+1)-L-1
        if (nk <= 0) continue;                      // IF(NK.LE.0)GO TO 15
        for (k=0; k<nk; k++)                        // DO 10 K=1,NK
        {
            lk = l + k;                             // LK=L+K
            AD[k] = A[lk];                      // AD(K)=RN(LK)
            A[lk] = 0;                          // 10 RN(LK)=0.
        }
        for (k=0; k<nk; k++)                        //  DO 11 K=1,NK
        {
            ns = i + k;                             //  NS=I+K
            lk = l + k;                             // LK=L+K
            for (j=0; j<nk; j++)                    // DO 12 J=1,NK
            {
                ij = i + j;                         // IJ=I+J
                m = PosDiag[ij] + ns - ij;          // M=MH(IJ)+NS-IJ
                if (ij > ns)                        // IF(IJ.GT.NS)M=MH(NS)+IJ-NS
                    m = PosDiag[ns] + ij - ns;      //
                A[lk] = A[lk] - AD[j]*A[m];         // 12 RN(LK)=RN(LK)-AD(J)*RN(M)
            }
            A[l] = A[l] - AD[k]*A[lk];              // RN(L)=RN(L)-AD(K)*RN(LK)
            F[i] = F[i] - AD[k]*F[ns];              // 11 FS(I)=FS(I)-AD(K)*FS(NS)
        }
    }                                               // 15 IF(I.GT.1)GO TO 9
 
        return true;
}
Заранее спасибо за помощь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2014, 22:31
Ответы с готовыми решениями:

Умножение треугольных матриц«Методы обработки разреженных матриц»
Нужно перемножить треугольные матрицы в обычном виде и в свёрнутом. С обычным...

Определители разреженных матриц
Здравствуйте! Помогите посчитать определители следующих матриц: 1)...

Найти сумму двух сильно разреженных матриц
Найти сумму двух сильно разреженных матриц A(m,n) и B(m,n), хранящихся в...

Разработать способ экономического хранения в памяти разреженных матриц
задание Разработать способ экономического хранения в памяти разреженных...

Разработать способ экономного хранения в памяти разреженных матриц
Помогите плз зделать Задание 1 Разработать способ экономного хранения в...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2014, 22:31

Сложение симметричных матриц
Как сложить две симметричные матрицы, заданные в верхнем треугольнике...

Найти произведение двух симметричных матриц
Найти произведение двух симметричных матриц и . Матри- цы хранятся в...

Программа определения количества симметричных матриц
Заданы две матрицы С(4, 4) и D(3, 3). Написать программу определения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru