Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2011, 21:09   #1
J.Bond
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 45
По умолчанию МАТРИЦЫ БОЛЬШЫХ РОЗМЕРОВ

Доброго времени суток дорогие форумчани и форумчанки)
мне нужно написать прогу для параллельного умножения матриц больших размеров на С++, а компилятор кричит: "array size toо large" уже при объявлении
матрицы размером 200х200, но мне то нужно создать матрицы гораздо больших размеров. ПОДСКАЖИТЕ пожалуйста, как этого добиться???
J.Bond вне форума Ответить с цитированием
Старый 07.04.2011, 15:30   #2
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

А вы выделяете в стеке? Попробуйте динамически, поковыряйтесь у себя в среде там вроде можно задать сколько он может выделять

зы еще лучше читайте из файла нужный столбец и строку матриц по мере надобности, если конечно у вас нет принципиального желания хранить в оперативке
ololo-schoolboy вне форума Ответить с цитированием
Старый 10.04.2011, 01:58   #3
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Чтобы написать программу вычисления чего-либо - нужно для начала хорошо разбираться в алгоритме по которому будет писаться программа - это позволить сообразить каким образом лучше хранить и обрабатывать данные.
Что касается хранения матрицы в памяти:
Для вычисления произведения матрицы не нужно хранить обе матрицы и еще и результирующую в оперативной памяти, так как для этого понадобится:
Nстрок x Mстолбцов + Mстрок x Nстолбцов + Mстрок x Mстолбцов свободного места, это большое расточительство.
Вообще говоря, следуя алгоритму умножения матриц, нам достаточно считывать по одному числу из файла, перемножать их между собой и складывать в какую-то переменную, тем самым формируя элемент результирующей матрицы - такой метод практически избавит нас от потребности использования оперативной памяти. Стоит помнить о том, что самый вместительный тип данных для хранения целого положительного числа unsigned __int64 (хранит значения от 0 до 18,446,744,073,709,551,615), а для хранения целого числа со знаком signed __int64 (хранит значения от –9,223,372,036,854,775,808 до 9,223,372,036,854,775,807). Также существует тип long long, по ёмкости аналогичен __int64. Но если организовывать программу только считыванием-записью из файла, то на работу такой программы уйдет вечность и мы скорее всего никогда не получим результат.
Вместо этого я рекомендовал бы изначально сгенерировать обе исходные матрицы и записать их данные в, например, 2 файла;
В программе задавать 2 массива (если размерность матрицы это позволяет) размерностью N для хранения соответственно строки и столбца первой и второй матрицы, далее перемножая строку-столбец результат записывать в новый файл.
Таким образом вместо исходно необходимого места размерностью NxM + MxN + MxM, нам потребуется всего-лишь 2*N свободного места в оперативной памяти - таким образом вы сможете организовать работу с матрицами очень больших размеров.

P.S. В конечном счете ограничение на количество данных в матрице зависит от компилятора. Для VS 2010 это ограничение равно:
Код:
total size of array must not exceed 0x7fffffff bytes
. Т.е. в массиве не могут разместиться данные общей размерностью более чем 2147483647 байт (на калькуляторе можно перевести из 16чной системы 0x7fffffff в десятиричную). Но это отнюдь не значит, что у нас есть возможность заказать сразу максимум, так как эта память также используется для хранения различной дополнительной информации необходимой компилятору - наиболее правильный способ заключается в выделении блоков оперативной памяти (например размерностью по 2 в 16 степени байт)и занесения в них информации.
Общее количество байт, необходимое для хранения данных вычисляется по формуле (грубое вычисление):
Код:
N*sizeof(type)
, где N - предельное число элементов в массиве.
Например, исходя из предыдущей формулы в VS2010 я могу создать массив типа int (4 байта) размерностью около [500 000 000] элементов (около 536870910 элементов) - но объявлять массив такой размерности не стоит, так как компилятор в процессе своей работы скорее всего не сможет правильно освободить и реорганизовать такой кусок памяти.
При использовании таких огромных объемов памяти необходимо выделять её блочно (например размерностью по 2 в 16 степени байт) и освобождать сразу после использования.

Последний раз редактировалось EC.cpp; 10.04.2011 в 09:30.
EC.cpp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TurboPascal: графы, матрицы смежности и матрицы инцидентности. ulala Помощь студентам 1 03.03.2011 19:28
Ф-ия, определяющая сумму строк матрицы, если на главной диагонали матрицы имеется отрицательный эл-т. Volk_xD Помощь студентам 6 05.01.2011 13:39
Матрицы:функция изменения порядка столбцов матрицы Fajyz Помощь студентам 0 13.01.2010 09:40
На главную диагональ матрицы поместить наибольшие элементы этой матрицы mivel Помощь студентам 2 23.12.2009 21:19