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

Разреженная матрица - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
MasoD
 Аватар для MasoD
6 / 6 / 1
Регистрация: 03.10.2010
Сообщений: 44
17.10.2011, 19:34     Разреженная матрица #1
Добрый вечер.
Из-за белезни, пролежал 2 недели дома, поэтому пропустил лекции по этой теме, а лабу надо сдавать.
Так вот, задача:

Разреженная матрица А(nxm) хранится в разреженном строчном формате. Смоделировать операцию вывода разреженной матрицы на экран в двух формах:
-в виде полной матрицы;
-для каждой строки печатается ее номер, а затем ненулевые элементы этой строки и за каждым из них в скобках соответствующий столбцовый индекс.

Может кто-нидь поможет? Заранее спасибо.

Вот задача друга, но я все равно не смог разобраться, но надо так же с AN, JA, JI.

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
//Разреженная матрица А(nxm) хранится в разреженном строчном формате. Смоделировать операцию 
//перестановки двух столбцов матрицы с получением результата в том же формате.
 
#include <iostream>
using namespace std;
 int main()
{
    int i,j,AN[16],JA[16],IA[4],k,t,p,st1,st2,x=0,BA[16],TA[16],a,b;
    int mas[4][4];
         cout<<"BBedite Matrichu"<<endl;
    for (i=0;i<=3;i++) 
    {
        for (j=0;j<=3;j++) 
        cin>>mas[i][j];
        cout<<endl;
    }
    system("cls");
for (i=0;i<=3;i++) 
    {
        for (j=0;j<=3;j++) 
        cout<<mas[i][j]<<' ';
    cout<<endl; 
    }
k=0;
for (i=0;i<=3;i++) 
    {
        for (j=0;j<=3;j++){ 
BA[x]=j;
TA[x]=mas[i][j];
x++;
 
         if (mas[i][j]!=0)
        {AN[k]=mas[i][j];
JA[k]=j;
 
k++;}}
}
p=k;
t=1;
 
cout<<"AN=";
for (i=0;i<16;i++){
    if (AN[i]>0) {cout<<AN[i]<<' ';}
}
cout<<endl;
cout<<"JA=";
for (i=0;i<16;i++){
if (AN[i]>0)
{   cout<<JA[i]<<' ';}}
cout<<endl;
IA[0]=1;
for(i=0;i<16;i++){
if (JA[i]<=JA[i-1])
{IA[t]=i+1;
t++;
}}
cout<<"IA=";
for (p=0;p<=4;p++){
cout<<IA[p]<<' ';
}
cout<<endl;
cout<<"BBedite Nomer 1 stolbcha"<<endl;
cin>>st1;
cout<<"BBedite Nomer 2 stolbcha"<<endl;
cin>>st2;
a=st1;
for (i=0;i<16;i++){
    if (BA[i]==st1) {a=i;
}
    if (BA[i]==st2)
    {
        BA[i]=st1;b=TA[i]; TA[i]=TA[a];TA[a]=b;}
BA[a]=st2;
}
cout<<endl;
k=0;
for (i=0;i<=3;i++) 
    {
        for (j=0;j<=3;j++) 
        {mas[i][j]=TA[k];
        k++;}
        
    }
k=0;
for (i=0;i<=3;i++) {
 
    for (j=0;j<=3;j++){ 
            if (mas[i][j]!=0)
        {AN[k]=mas[i][j];
JA[k]=j;
k++;}}
}
cout<<"AN=";
for (i=0;i<16;i++){
    if (AN[i]>0) {cout<<AN[i]<<' ';}
}
cout<<endl;
cout<<"JA=";
for (i=0;i<16;i++){
if (AN[i]>0)
{   cout<<JA[i]<<' ';}}
cout<<endl;
IA[0]=1;
for(i=0;i<16;i++){
if (JA[i]<=JA[i-1])
{IA[t]=i+1;
t++;
}}
cout<<"IA=";
for (p=0;p<=4;p++){
cout<<IA[p]<<' ';
}
cout<<endl;
system("pause");
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2011, 19:34     Разреженная матрица
Посмотрите здесь:

C++ Матрица
Матрица C++
Квадратная матрица А называется ортогональной,если А^T=А^-1. Определить, является ли заданная матрица А(n,n) ортогональной. C++
C++ Даны квадратная матрица A порядка n и вектор с n элементами. Получить вектор: (A=E)b, где E единичная матрица порядка n
Дана матрица целых чисел, из n строк и n столбцов (n < = 100).Определить является ли матрица нулевой (состоит из одних нулей) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MasoD
 Аватар для MasoD
6 / 6 / 1
Регистрация: 03.10.2010
Сообщений: 44
19.10.2011, 22:12  [ТС]     Разреженная матрица #2
Никто не глянет?
MasoD
 Аватар для MasoD
6 / 6 / 1
Регистрация: 03.10.2010
Сообщений: 44
04.11.2011, 15:47  [ТС]     Разреженная матрица #3
Может хотя бы в общих чертах?
MasoD
 Аватар для MasoD
6 / 6 / 1
Регистрация: 03.10.2010
Сообщений: 44
06.11.2011, 20:21  [ТС]     Разреженная матрица #4
Матрица переводится в строчный формат, а вот обратно беда - не знаю как прикрутить массив IA. Посмотрите пжлста.

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
#include <iostream>
#include <locale>
#include <iomanip>
 
using std::cout;
using std::cin;
using std::endl;
using std::setw;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    const unsigned short n = 4;
    const unsigned short m = 4;
    const unsigned short amt = n*m;
    short Matrix[n][m] = {{0}};
    short Array[amt] = {0};
    short AN[amt] = {0};
    short JA[amt] = {0};
    short IA[n + 1] = {0};
    short k = 0;
    short p = 0;
    short t = 0;
    short x = 0;
    short q = 0;    
 
    cout << endl
         << "Введите матрицу (" << n << "x" << m << "):"
         << endl
         << endl;
    for(short i = 0; i < n; i++)    
        for(short j = 0; j < m; j++)
            cin >> Matrix[i][j];
 
    for(short i = 0; i < n; i++)    
    {
        q = 0;
        for(short j = 0; j < m; j++)
        {           
            if (Matrix[i][j] != 0)
            {
                AN[k] = Matrix[i][j];
                JA[k] = j;
                if (q == 0)
                {
                    IA[t] = k;
                    for(short h = t; h < n; h++)
                        IA[h] = k;
                    t++;
                }
                q = 1;
                k++;
            }
        }   
    }
    cout << endl 
        << "AN = ";
    for(short i = 0; i < amt; i++)
        if (AN[i] > 0)
            cout << AN[i] << " ";
    cout << endl
        << "JA = ";
    for(short i = 0; i < amt; i++)
        if (AN[i] > 0)
            cout << JA[i] << " ";   
    IA[0] = 0;
    IA[n] = k;
    cout << endl
        << "IA = ";
    for(short i = 0; i < n + 1; i++)
        cout << IA[i] << " ";
 
 
    cout << endl
        << endl
        << "Нормальная форма: "
        << endl;
    for(short i = 0, j = 0, k = 0, t = 0, p = 0; i < amt; i++)  
    {   
//      t = IA[p];
        if (JA[t] == k)
        {
            cout << AN[j] << " ";
            j++;
            t++;
        }
        else
            cout << "0" << " ";
        k++;
        if (!((i + 1)%n))
        {
            cout << endl;
            k = 0;
//          p++;
        }
    }
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.11.2011, 07:27     Разреженная матрица #5
Цитата Сообщение от MasoD Посмотреть сообщение
Из-за белезни, пролежал 2 недели дома, поэтому пропустил лекции по этой теме, а лабу надо сдавать.
Ну хоть знаешь, что разреженным массивом называется массив, действительное количество элементов которого меньше их номинального количества? Сами же способы сжатия могут быть любыми. Можно юзить массив индексов, массив указателей, блочные представления, а если заполненность распределена достаточно регулярна, то и просто пересчёт индексов.
MasoD
 Аватар для MasoD
6 / 6 / 1
Регистрация: 03.10.2010
Сообщений: 44
07.11.2011, 12:53  [ТС]     Разреженная матрица #6
taras atavin, спасибо. уже сделал.
Yandex
Объявления
07.11.2011, 12:53     Разреженная матрица
Ответ Создать тему
Опции темы

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