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

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

26.02.2012, 13:58. Показов 5952. Ответов 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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru