Форум программистов, компьютерный форум CyberForum.ru

Хранение разреженной структурно-симметричной матрицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
TonyPetro
1 / 1 / 0
Регистрация: 22.11.2011
Сообщений: 9
28.03.2013, 16:55     Хранение разреженной структурно-симметричной матрицы #1
Здравствуйте. Пытаюсь разобраться вот с этим заданием:

Дана разреженная структурно симметричная матрица. Найти матрицу, обратную к ней.

Написал алгоритм хранения этой матрицы с помощью пять массивов как предложено было преподавателем (см. фотото)
Еще сделал функцию получения значения матрицы от i,j.
Помогите разобраться как сделать обратную матрицу. Все операции нужно производить только над запакованными матрицвми.

Код:
Кликните здесь для просмотра всего текста
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "stdafx.h"
#include <iostream>
using namespace std;
 
struct ssmatrix //Структура хранения матрицы
{
    int N;
    int NZ;
    int *AD;
    int *AU;
    int *AL;
    int *LJ;
    int *LI;
};
 
void initializeMatrix(int N, int NZ, ssmatrix &mtx) //Функция инициализации матрицы
{
    mtx.N=N;
    mtx.NZ=NZ;
    mtx.AD=new int [N];
    mtx.AU=new int [NZ];
    mtx.AL=new int [NZ];
    mtx.LJ=new int [NZ];
    mtx.LI=new int [N];
}
 
void fillingMatrix(int N, int NZ, ssmatrix &mtx) //Функция заполнения массивов структуры матрицы
{
    int i, j, c=0, el, i1=0, b=-1;
 
    cout<<"Введите элементы диагонали";
    for(i=0;i<N;i++) cin>>mtx.AD[i];
    cout<<"Введите элементы матрицы:";
    while(c!=NZ)
    {
        cout<<"Координаты i,j = "; cin>>i>>j;
        cout<<"["<<i<<"]["<<j<<"] = "; cin>>el; mtx.AU[i1]=el; mtx.LJ[i1]=j;
        if(b<i)
        {
            mtx.LI[i]=i1;
            b=i;
        }
 
        cout<<"["<<j<<"]["<<i<<"] = "; cin>>el; mtx.AL[i1]=el;
 
        //cout<<"Продолжить? 0-выйти"; cin>>c;
        c++;
        i1++;
    }
    mtx.LI[N-1]=i1;
 
    for(i=N-1;i>=0;i--)
    {
        if(mtx.LI[i]<0) mtx.LI[i]=mtx.LI[i+1];
    }
}
 
int procedureMatrix(int i, int j, ssmatrix &mtx) //Поиск элемента матрицы
{
    int AA=0, N1, N2, k;
    N1= mtx.LI[i];
    N2= mtx.LI[i+1];
    
    if(i==j) return mtx.AD[i];
    if(i<j) 
    {
        N1= mtx.LI[i];
        N2= mtx.LI[i+1];
        for(k=N1;k<N2;k++) if(mtx.LJ[k]==j) {AA=mtx.AU[k];break;}
    }
    if(i>j)
    {
        N1= mtx.LI[j];
        N2= mtx.LI[j+1];
        for(k=N1;k<N2;k++) if(mtx.LJ[k]==i) {AA=mtx.AL[k];break;}
    }
    return AA;
}
 
void printMatrix(int N, ssmatrix &mtx) //Вывод матрицы на экран
{
    for (int i=0;i<N;i++)
    {
        for ( int j=0;j<N;j++) cout<<procedureMatrix(i,j,mtx)<<" ";
        cout<<endl;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"RUSSIAN"); //Включаем русский язык в консоли
 
    struct ssmatrix mtx;
    struct ssmatrix invmtx;
    int N,NZ,i,j;
 
    cout<<"Размерность матрицы: "; cin>>N;
    cout<<"Кол-во ненулевых элементов верхнего или нижнего треугольника: "; cin>>NZ;
 
    initializeMatrix(N, NZ, mtx); //Инициализируем матрицу mtx
    initializeMatrix(N, NZ, invmtx); //Инициализируем матрицу invmtx
    fillingMatrix(N, NZ, mtx);
    
    //-------- Выводим массивы для проверки
    cout<<endl<<"AD "; for(i=0;i<N;i++) cout<<mtx.AD[i]<<" ";
    cout<<endl<<"AU "; for(i=0;i<NZ;i++) cout<<mtx.AU[i]<<" ";
    cout<<endl<<"AL "; for(i=0;i<NZ;i++) cout<<mtx.AL[i]<<" ";
    cout<<endl<<"LJ "; for(i=0;i<NZ;i++) cout<<mtx.LJ[i]<<" ";
    cout<<endl<<"LI "; for(i=0;i<N;i++) cout<<mtx.LI[i]<<" ";
    //--------
    cout<<endl;
 
    printMatrix(N,mtx);
 
    return 0;
}


Фото:

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TonyPetro
1 / 1 / 0
Регистрация: 22.11.2011
Сообщений: 9
28.03.2013, 17:21  [ТС]     Хранение разреженной структурно-симметричной матрицы #2
вложение
Миниатюры
Хранение разреженной структурно-симметричной матрицы  
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
28.03.2013, 17:39     Хранение разреженной структурно-симметричной матрицы #3
Я советую вам создать класс под запакованную матрицу. И самым первым делом после построения сжатой версии - создать функцию возвращения значения элемента i-ой j-ой позиции из вашей сжатой матрицы.
Например:
int get(int i, int j);

,и вставки элемента number на i j позицию в эту сжатую матрицу.
Например:
void set(int i, int j, int number);

И все. Эти функции вам помогут сотворить с вашей сжатой матрицей, что вашей душе угодно. Не беспокойтесь о времени выполнения и не придумывайте гипер-сложно-быстрый алгоритм, вы всегда сможете усовершенствовать алгоритм после написания интуитивного.
TonyPetro
1 / 1 / 0
Регистрация: 22.11.2011
Сообщений: 9
28.03.2013, 19:30  [ТС]     Хранение разреженной структурно-симметричной матрицы #4
Цитата Сообщение от eocron Посмотреть сообщение
Я советую вам создать класс под запакованную матрицу. И самым первым делом после построения сжатой версии - создать функцию возвращения значения элемента i-ой j-ой позиции из вашей сжатой матрицы.
Например:
int get(int i, int j);

,и вставки элемента number на i j позицию в эту сжатую матрицу.
Например:
void set(int i, int j, int number);

И все. Эти функции вам помогут сотворить с вашей сжатой матрицей, что вашей душе угодно. Не беспокойтесь о времени выполнения и не придумывайте гипер-сложно-быстрый алгоритм, вы всегда сможете усовершенствовать алгоритм после написания интуитивного.
Хорошо я постараюсь все в класс засунуть. Функцию возращения значения я уже написал procedureMatrix(int i, int j, ssmatrix &mtx), можете помочь со второй функцией set, затрудняюсь с ее реализацией

Добавлено через 1 час 34 минуты
хотябы скиньте примеры алгоритмов
Yandex
Объявления
28.03.2013, 19:30     Хранение разреженной структурно-симметричной матрицы
Ответ Создать тему
Опции темы

Текущее время: 06:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru