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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.92
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
#1

Как лучше всего хранить коэффициенты? - C++

26.02.2012, 13:58. Просмотров 3040. Ответов 52
Метки нет (Все метки)

Мне нужно работать с матрицей порядка 100 000. Она сильно разреженная, по этому хранить все коэффициенты - не вижу смысла. Стало быть нужно хранить только не нулевые элементы матрицы. Но вот как это сделать лучше всего, чтобы было задействовано как можно меньше памяти?
Элементы матрицы типа double
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2012, 13:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как лучше всего хранить коэффициенты? (C++):

Задача на алгоритм Дейкстры (как лучше хранить информацию?) - C++
Доброго времени суток. Есть задача: Есть идея хранить входные данные след. образом: Выделить в памяти 2-х матрицы(Tab1 и Tab2...

Оконный менеджер. Как лучше хранить указатели на элементы менеджера? - C++
Привет! Делаю тут 3D движок :wizard: В общем есть главный класс движка mgeSystem, так же есть класс окна mgeWindow, который не...

Как лучше всего создать форму в С++ - C++
Хочу попробовать создать не консольную программу, а графическую. Как лучше всего создавать формы?

Как лучше всего учить язык C++? - C++
Хочу начать изучать язык программирования! Остановился на C++, а с чего начать не знаю!

Как лучше всего реализовать настройки в программе? - C++
Хочу грамотно сделать настройки для своей программы. Сейчас примерно так: программа создаёт объект класса Settings, там пользователь...

Как лучше всего разрабатывать GUI проложения? - C++
доброе время суток, ребят вопрос какой вы подход используете в разработки GUIx приложение, сначало пишите консольный вариант а потом...

52
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
28.02.2012, 21:24 #16
hello19, да, это будет работать. Всё зависит от того, как вы к ним собираетесь обращаться.
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 12:24  [ТС] #17
да там вроде бы ничего сложного...
C++
1
2
3
matrix[i].one // обращение к строке
matrix[i].two // обращение с столбцу
matrix[i].three // обращение к значению коэффициенту матрицы
единственное, что меня напрягает, так это то, что... вот мне придется делать кое какие преобразования с коэффициентам, стоящими в каждой отдельной строке...
Там нужно будет сделать что-то типа цикла.. не соображу, как можно это реализовать....

Добавлено через 1 час 23 минуты
Не соображу, как сделать функцию доступа к нужным элементам...
0
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:19 #18
hello19, нет, я не это имею ввиду (программную реализацию я знаю). Вы можете сказать задачу, в которой вам нужно использовать динамический массив, я хочу понять что вам лучше использовать.
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:21  [ТС] #19
задача следующая - решить систему уравнений итерационным методом. Матрица системы - сильноразреженная. По этому нет смысла хранить все элементы, т.к. большая их часть просто нули.
Я хочу хранить лишь ненулевые элементы и уже с ними работать...
Вот только не знаю, как лучше их хранить...
0
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:27 #20
hello19, как мне кажется, можно сделать обычный динамический массив (можно vector), и каждый раз где надо использовать коэффициент, сравнивать, если индекс элемента динамического коэффициента равен индексу коэффициента, то подставляем и прибавляем счётчик текущего индекса динам. массива, иначе вставляем 0, и переходим к следующему. Если я правильно вас понял.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
01.03.2012, 20:31 #21
Цитата Сообщение от hello19 Посмотреть сообщение
Матрица системы - сильноразреженная. По этому нет смысла хранить все элементы, т.к. большая их часть просто нули.
если тебе не важна скорость
все эти динам массивы списки работают гораздо медленнее
ну это извечный вопрос скорость/память
0
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:32 #22
ValeryS, да, медленнее в 4 раза где-то, но если экономия памяти превышает это число то очень полезно.
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:32  [ТС] #23
Цитата Сообщение от thebvog Посмотреть сообщение
hello19, как мне кажется, можно сделать обычный динамический массив (можно vector), и каждый раз где надо использовать коэффициент, сравнивать, если индекс элемента динамического коэффициента равен индексу коэффициента, то подставляем и прибавляем счётчик текущего индекса динам. массива, иначе вставляем 0, и переходим к следующему. Если я правильно вас понял.
Можете на коде показать?
0
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:35 #24
hello19, могу для обычного уравнения, а это эти я не помню.
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:35  [ТС] #25
да ну хоть как... просто глазами увидеть..
0
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:43 #26
hello19,
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
struct k {
    double value;
    int cow, row;
}
 
...
 
int main()
{
   // Ввели коэффициенты
   int n, i;
   cin>>n;
   table = new k[n];
   for (i=0;i<n;i++)
   {
       cin>>k[n]->value;
       cin>>k[n]->row;
       cin>>k[n]->cow;
   }
   ...
   int x, y;
   int cow, row; // текущие строка и столбец
   int kp = 0; // текущий коэффициент
   cow=k[kp]->cow;
   row=k[kp]->row;
   for (y=0;y<TABLE_Y;y++)
       for (x=0;i<TABLE_X;x++)
       {
           if ((x==row) && (y==cow))
           {
               // Вставляем коэффициент
               print("%d",k[kp]->value);
               kp++;
               cow=k[kp]->cow;
               row=k[kp]->row;
           }
       }
 
    return 0;
}
Как-то так, не тестировал.
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:52  [ТС] #27
а какие входные данные?
вот скажем, если у меня вот такая система уравнений:
1*x1 + 2x3 = 3
x2 = 5
x3 = 1
как лучше всего хранить ненулевые коэффициенты?
0
thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:56 #28
hello19,
1*x1 + 2x3 = 3
x2 = 5
x3 = 1
Если правильно понял, то в полной форме примерно так:
1*x1 + 0*x2 + 2x3 = 3
0*x1 + 1*x2 + 0*x3 = 5
0*x1 + 0*x2 + 1*x3 = 1
И вот матрица 4 на 3, а храним только элементы с позицией, 1:1, 3:1, 4:1, 2:2, 4:2, 3:3, 4:3.
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:59  [ТС] #29
вот, да.. это было бы замечательно.. но как это сделать?
0
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
01.03.2012, 21:01 #30
Если интересно, то есть еще один способ, предложенный в книжке Мозговой М. C++ Мастер-класс. 85 нетривиальных проектов, решений и задач раздел 1.2 Разреженные матрицы там показан пример класса, в нем используются map и pair.
0
01.03.2012, 21:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2012, 21:01
Привет! Вот еще темы с ответами:

Как лучше всего разделить строку на несколько подстрок? - C++
Есть строка вида параметр1*параметр2*параметр3*параметр4. Как разделить эту строку, чтобы получить в первой переменной параметр1, во...

Как лучше всего пробежать все элементы контейнера? - C++
Речь о следующем. Есть vector. Я хочу пробежать все его элементы, но походу я буду проверять удовлетворяют они определенному условию или...

Как же все-таки лучше всего перегружать операторы? - C++
1. Нужно ли использовать friend там, где это возможно? (или не стоит злоупотреблять где-нибудь?) 2. Стоит ли при перегрузке бинарного...

Нужен совет: как лучше всего сгенерировать документ .doc с оформлением по ГОСТу - C++
Хай. Надо написать программу которая будет оформлять текст так сказать по госту(шрифт, размер интервал), была возможность вставлять туда...


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

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

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