|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.04.2011, 21:09 | #1 |
Пользователь
Регистрация: 12.05.2010
Сообщений: 45
|
МАТРИЦЫ БОЛЬШЫХ РОЗМЕРОВ
Доброго времени суток дорогие форумчани и форумчанки)
мне нужно написать прогу для параллельного умножения матриц больших размеров на С++, а компилятор кричит: "array size toо large" уже при объявлении матрицы размером 200х200, но мне то нужно создать матрицы гораздо больших размеров. ПОДСКАЖИТЕ пожалуйста, как этого добиться??? |
07.04.2011, 15:30 | #2 |
Форумчанин
Регистрация: 25.12.2010
Сообщений: 247
|
А вы выделяете в стеке? Попробуйте динамически, поковыряйтесь у себя в среде там вроде можно задать сколько он может выделять
зы еще лучше читайте из файла нужный столбец и строку матриц по мере надобности, если конечно у вас нет принципиального желания хранить в оперативке |
10.04.2011, 01:58 | #3 |
Пользователь
Регистрация: 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 это ограничение равно: Код:
Общее количество байт, необходимое для хранения данных вычисляется по формуле (грубое вычисление): Код:
Например, исходя из предыдущей формулы в VS2010 я могу создать массив типа int (4 байта) размерностью около [500 000 000] элементов (около 536870910 элементов) - но объявлять массив такой размерности не стоит, так как компилятор в процессе своей работы скорее всего не сможет правильно освободить и реорганизовать такой кусок памяти. При использовании таких огромных объемов памяти необходимо выделять её блочно (например размерностью по 2 в 16 степени байт) и освобождать сразу после использования. Последний раз редактировалось EC.cpp; 10.04.2011 в 09:30. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |