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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
TonyPetro
1 / 1 / 0
Регистрация: 22.11.2011
Сообщений: 9
#1

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

28.03.2013, 16:55. Просмотров 2074. Ответов 3
Метки нет (Все метки)

Здравствуйте. Пытаюсь разобраться вот с этим заданием:

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

Написал алгоритм хранения этой матрицы с помощью пять массивов как предложено было преподавателем (см. фотото)
Еще сделал функцию получения значения матрицы от 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;
}


Фото:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2013, 16:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хранение разреженной структурно-симметричной матрицы (C++):

Как перегрузить оператор [][] для разреженной матрицы? - C++
как перегрузить оператор для разреженной матрицы?знаю, что такого оператора нет, есть только , но все равно не понимаю как его перегрузить

Перегрузка оператора () для разреженной матрицы в CSR-формате - C++
Доброй ночи! Я пишу класс разреженных матриц, которые хранятся в CSR-формате. Допустим, есть матрица А. Для доступа к ее значениям на...

Формирование симметричной матрицы с сохранением в файл - C++
Добрый день! Помогите пожалуйста сформировать матрицу Есть такой код, который формирует матрицу с главной диагональю 0, как сделать ее...

Нужна помощь в построении симметричной матрицы 9x9... - C++
Необходимо создать квадратную матрицу целых чисел размером 9х9. По условию необходимо заполнить матрицу случайными числами. Отобразить...

Для матрицы 7х7 определить,является ли она симметричной относительно главной диагонали. - C++
Помогите с задачей. Для матрицы 7х7 определить,является ли она симметричной относительно главной диагонали.

Крестики-нолики (в классах) - Правильно ли структурно написана программа - C++
//main.cpp #include&lt;iostream&gt; #include&lt;windows.h&gt; #include&quot;board.h&quot; #include&quot;BoardView.h&quot; using namespace std; int main()...

3
TonyPetro
1 / 1 / 0
Регистрация: 22.11.2011
Сообщений: 9
28.03.2013, 17:21  [ТС] #2
вложение
0
Миниатюры
Хранение разреженной структурно-симметричной матрицы  
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);

И все. Эти функции вам помогут сотворить с вашей сжатой матрицей, что вашей душе угодно. Не беспокойтесь о времени выполнения и не придумывайте гипер-сложно-быстрый алгоритм, вы всегда сможете усовершенствовать алгоритм после написания интуитивного.
0
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 минуты
хотябы скиньте примеры алгоритмов
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 19:30
Привет! Вот еще темы с ответами:

Хранение матрицы при решении огромных СЛАУ - C++
Компьютер может решать СЛАУ с матрицей в миллион строк. Для хранения такой матрицы в оперативной памяти среднестатистического компьютера...

Создание разреженной симметричной матрицы - Matlab
Мне необходимо создать разреженную симметричную матрицу и записать ее в файл( записать надо как таблицу), чтобы потом использовать ее в...

Заполнение симметричной матрицы - Delphi
Имеется массив с N количеством цифр, на основе этих значений нужно создать симметричную матрицу. К примеру, в массиве значения 1 2 3 4 5,...

Генерация симметричной матрицы размеров n*n - Java SE
Добрый день. В задании дали написать метод, который генерирует симметричную матрицу размеров n*n. Матрица заполняется при этом случайными...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
28.03.2013, 19:30
Ответ Создать тему
Опции темы

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