Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/23: Рейтинг темы: голосов - 23, средняя оценка - 4.78
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313

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

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

Студворк — интернет-сервис помощи студентам
Мне нужно работать с матрицей порядка 100 000. Она сильно разреженная, по этому хранить все коэффициенты - не вижу смысла. Стало быть нужно хранить только не нулевые элементы матрицы. Но вот как это сделать лучше всего, чтобы было задействовано как можно меньше памяти?
Элементы матрицы типа double
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2012, 13:58
Ответы с готовыми решениями:

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

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

Как лучше всего хранить контент сайта?
Привет всем. Недавно стал вопрос, как правильно хранить контент с тегами в бд. Допустим у меня есть 3000 статей из разных категорий, каждая...

52
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
01.03.2012, 20:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hello19 Посмотреть сообщение
Матрица системы - сильноразреженная. По этому нет смысла хранить все элементы, т.к. большая их часть просто нули.
если тебе не важна скорость
все эти динам массивы списки работают гораздо медленнее
ну это извечный вопрос скорость/память
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:32
ValeryS, да, медленнее в 4 раза где-то, но если экономия памяти превышает это число то очень полезно.
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:32  [ТС]
Цитата Сообщение от thebvog Посмотреть сообщение
hello19, как мне кажется, можно сделать обычный динамический массив (можно vector), и каждый раз где надо использовать коэффициент, сравнивать, если индекс элемента динамического коэффициента равен индексу коэффициента, то подставляем и прибавляем счётчик текущего индекса динам. массива, иначе вставляем 0, и переходим к следующему. Если я правильно вас понял.
Можете на коде показать?
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:35
hello19, могу для обычного уравнения, а это эти я не помню.
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:35  [ТС]
да ну хоть как... просто глазами увидеть..
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:43
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
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:52  [ТС]
а какие входные данные?
вот скажем, если у меня вот такая система уравнений:
1*x1 + 2x3 = 3
x2 = 5
x3 = 1
как лучше всего хранить ненулевые коэффициенты?
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 20:56
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
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 20:59  [ТС]
вот, да.. это было бы замечательно.. но как это сделать?
0
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
01.03.2012, 21:01
Если интересно, то есть еще один способ, предложенный в книжке Мозговой М. C++ Мастер-класс. 85 нетривиальных проектов, решений и задач раздел 1.2 Разреженные матрицы там показан пример класса, в нем используются map и pair.
1
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 21:01
hello19, как я показал выше. Вводим 1:1, 3:1, 4:1, 2:2, 4:2, 3:3, 4:3 и соответствующее им значение коэффициента.
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 21:07  [ТС]
Цитата Сообщение от Xind Посмотреть сообщение
Если интересно, то есть еще один способ, предложенный в книжке Мозговой М. C++ Мастер-класс. 85 нетривиальных проектов, решений и задач раздел 1.2 Разреженные матрицы там показан пример класса, в нем используются map и pair.
Интересно-интересно... сейчас поищу литературу

Добавлено через 5 минут
Цитата Сообщение от thebvog Посмотреть сообщение
hello19, как я показал выше. Вводим 1:1, 3:1, 4:1, 2:2, 4:2, 3:3, 4:3 и соответствующее им значение коэффициента.
Да ну я просто не знаю как их хранить...
вот я раньше делал вот вот так вот:
C++
1
2
3
4
5
6
7
    struct elements
    {
        int one; // строка
        int two; // столбец
        double three; // значение коэффициента
    };
    vector <elements> matrix(N);
допустим я туда считал 1:1, 3:1, 4:1, 2:2, 4:2, 3:3, 4:3 и соответствующее им значение коэффициентов
дальше мне надо будет работать с элементами одной строки... проще всего - сделать цикл...
но проблема в том, что для этого

Вот как мне циклом умножить все коэффициенты первой строки например на 2?
я запускаю цикл по столбцам при фиксированной строке... но ведь у меня не все столбцы то заняты...вот в первой строке, например, нет коэффициента стоящего на 2-м месте...
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 21:12
hello19, умножить на 2 можно так:
C++
1
2
3
4
do
{
    k[i]->value *= 2;
} while (k[i]->row == ROW);
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 21:17  [ТС]
а, скажем, если мне надо 1 и 3 умножить на 2, а последний разделить на 2..
и что означает эта строчка:
C++
1
while (k[i]->row == ROW)
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
01.03.2012, 21:20
hello19, просто добавить условие сравнивания ещё и cow.
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.03.2012, 21:24  [ТС]
ммм... вообщем тут есть еще над чем подумать.. в субботу продолжу спасибо!
0
01.03.2012, 21:27

Не по теме:

hello19, не за что :)

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.03.2012, 01:26
hello19, ты на неверном пути. Лучше того что мы паяли с тобой летом врядли можно без спец методов решения СЛАУ высокого порядка решить.
Смотри у нас было 4000х4000 элементов - это ~ 128000000 байт (122 Мб), виртуалка уже начинала трещать. Теперь ты вводишь структуру
Цитата Сообщение от hello19 Посмотреть сообщение
struct elements
* * * * {
* * * * * * * * int one; // строка
* * * * * * * * int two; // столбец
* * * * * * * * double three; // значение коэффициента
* * * * };
* * * * vector <elements> matrix(N)
- у тебя в 3 раза выростет объём виртуалки (т.к. в структуре 3 поля) 3х122 = 366 Мб (с таким динамическим монстром не всякое железо справится).
Я тебе предлагаю подождать недельку, я как раз расмотрю методы решения СЛАУ высокого порядка здесь https://www.cyberforum.ru/faq/... ost2431657

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Содержание FAQ
...
4.5 Класс Матрица.
5 Системы линейных алгебраических уравнений(СЛАУ)


5.1 Метод Гаусса
5.2 Матричный способ решения
5.3 Метод Крамера
5.4 Решение СЛАУ высокого порядка
6 Геометрические задачи
7 Распознавание ручного ввода задания аналитических зависимостей

Не по теме:

hello19, просто поверь ты сейчас на неверном пути. Никакого выиграша структуры тебе не дадут. У тебя есть Гаусс(лучше его в плане производительности для не спец методов на мой взгляд нет!). Для разрежённых матриц думаю напаять метод с обобщённым правилом Саррюса для определителя n-го порядка, может откопаю где-то норм описание спец методов тога будет настоящий алгоритм...

0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
03.03.2012, 02:07
для хранения разреженных матриц методов много. одни сильно выигрывают по памяти, но уступают по скорости "распаковки", другие - наоборот.
если матрица у нас N*N и в ней k ненулевых элементов, то есть метод, позволяющий хранить 2*k значений для сохранения данных о матрице. алгоритм таков:

пусть дана матрица:
0 0 3 0 0
1 0 2 0 0
0 0 0 0 4
0 5 0 1 0
0 0 0 0 1
Заведем массив Values, в котором перечислим все значения, выбрав определенный способ обхода (по столбцам, к примеру).
Values={1,5,3,2,1,4,1}
Теперь заведем массив Coords, элементами которого будет значение i+(j-1)*n, где i-номер строки, j-номер столбца элемента из массива Values, а n-порядок матрицы. Проще говоря порядковый номер при выбранном виде обхода. Получим:
Coords={2,9,11,12,19,23,25}

Соответственно, для проверки возьмем произвольные координаты элементов: (3;4) и (4;2). Подставляем в формулу выше и получаем значения 18 и 9. Ищем эти значения в массиве coords. 18 не найдено, значит элемент нулевой. 9 найдено, значит элемент не нулевой. Берем индекс этого значения в Coords - под этим же номером в Values будет храниться значение.

Если матрица симметричная, то алгоритмы еще интереснее. А если к тому же и ленточная (все ненулевые элементы близко к диагонали), то там крайне эффективные схемы хранения есть.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.03.2012, 02:15
Цитата Сообщение от Paporotnik Посмотреть сообщение
Если матрица симметричная, то алгоритмы еще интереснее. А если к тому же и ленточная (все ненулевые элементы близко к диагонали), то там крайне эффективные схемы хранения есть.
- там ничего такого нет(по крайней мере заметить это нереально ввиду колоссального объёма матрицы).
Вот тот топик
Решить систему алгебраических линейных неоднородных уравнени
я даю ссылку на проект на котором по памяти остановились.

Paporotnik, если есть настоящие соображения по матрицам и СЛАУ с готовностью выслушаю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.03.2012, 02:15
Помогаю со студенческими работами здесь

Как лучше всего хранить данные для приложения?
Допустим есть статический массив интов,или булов.Как его сохранять(onDestroy()) и подгружать(onCreate), наиболее минимальным кол-вом строк...

Где и как лучше всего хранить структурированную информацию
У меня строковые данные вида: департамент строительства приказ N 21 письмо 12 письмо о тарифах департамент...

Как лучше всего хранить двумерный массив переменного размера
Здравствуйте! Мне нужно хранить квадратный массив, размер которого может увеличиваться, но он всегда остается квадратным (храню матрицу...

Как лучше всего хранить текстовые данные (более 1000 слов)
В чём суть вопроса: начинаю делать игру для android, думаю над лучшим решением для хранения словаря со словами, которых более тысячи. Как в...

Где и как лучше всего хранить строку, которая будет подвергаться значительным изменениям
Добрый вечер. Пишу программу, которая использует строку и предполагает большое кол-во внесенных и изменений в данную строку. Насколько мне...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru