2012-06-26 7 views
0

Мне нужно иметь дело с большими массивами чисел с плавающей запятой (> 200 000 номеров) и выполнять некоторые математические вычисления с этими массивами.Каков наилучший способ обработки больших массивов чисел на C++?

Что вы предлагаете рассматривать эти массивы так, чтобы у меня не возникало проблем с переполнением стека?

ОБНОВЛЕНИЕ: Я хочу выполнять простые и сложные математические операции (суммы, произведения, sin, cos, arctan).

+7

Вы не можете получить проблемы с переполнением стека, если они не находятся в стеке. – chris

+1

Зависит от того, что вы хотите с ними делать. – m0skit0

+2

Объяснение того, что вы хотите с ними, может помочь –

ответ

-1

Предлагаю вам обращаться с ними как 10.000 за 10.000, а затем суммировать все? Это зависит от того, какие операции вы делаете.

+0

Hey NeeL, это также кажется правдоподобным предложением, но я пытался избежать этого. Посмотрим, смогу ли я справиться! – maibaum

-3

Зависит от того, что вы хотите с ними делать.

Кроме того, как сказал Крис в комментариях, динамически выделяйте память для своего массива (чтобы получить память из кучи) и не используйте его как локальную переменную (которая выделена в стеке).

+2

Нет, _do not_ используйте 'new', если вы действительно не знаете, что делаете. И даже тогда, вероятно, лучший способ. –

+0

Спасибо за ваши исправления, но может ли кто-нибудь уточнить, почему использование нового в этой ситуации плохое? – m0skit0

+0

Использование 'нового' в (почти) _any_ ситуации плохое. Конечно, вы думаете, что вы классные и все, выделяя буфер с помощью 'new', но затем генерируется исключение, а bam - утечка. Вместо этого используйте интеллектуальные указатели и/или контейнеры. –

1

Если ваши данные разрежены, вы, вероятно, можете использовать boost sparse_matrixhttp://www.boost.org/doc/libs/1_41_0/libs/numeric/ublas/doc/matrix_sparse.htm, чтобы представлять структуру данных и значительно сократить требования к памяти.

В противном случае я бы предложил изучить способы разделения данных на куски и работу с одним куском в памяти, затем сохранить это состояние в файл и повторить.

6

Простые цифровые данные, для которых необходимо последовательно работать?

std::valarray<double> 

Если профилирование показывает, что это замедляет вас вниз, искать способы, чтобы сделать это быстрее

std::valarray<double>::resize() 

(да, нет нет reserve() к сожалению.

Почему std::valarray<double> для числовых данных? Если вы хотите выполнить операцию над каждым элементом, просто позвоните по телефону

std::valarray<double>::apply(somefunction) 

См. Дополнительную информацию: a C++ reference.

Если вы хотите иметь возможность reserve(), вам понадобится std::vector, что также прекрасно, но не имеет перегрузок для математических функций, которые вы можете использовать.


EDIT: Это, конечно, если у вас есть достаточно памяти, чтобы соответствовать всем массивам в std::valarray с. Если нет, вы должны разбить 200 000 строк так, чтобы в память одновременно включалось только так много поплавков.

+0

Эй, rubenvb. Это выглядит многообещающе. Данные не очень простые (они являются результатом наблюдений за разными объектами), но да, я хочу последовательно выполнять операции. Я попробую, чтобы я вернулся, чтобы сказать, каков результат. – maibaum

Смежные вопросы