Гибкий размер массива в C - PullRequest
0 голосов
/ 27 мая 2011

Я кодирую алгоритм MCMC на C, и у меня есть небольшая проблема.Идея этого алгоритма состоит в том, чтобы сделать выводы о количестве групп в популяции.Итак, допустим, мы начинаем с k групп.Где первое значение для k задается пользователем или выбирается случайным образом.Теперь на каждом шаге алгоритм k может уменьшаться на 1, увеличиваться на 1 или оставаться прежним.И у меня есть некоторые переменные для каждой группы:

double *mu;
double *lambda;
double **A

mu и лямбда действительно являются массивами из k элементов, а A является двумерным массивом из kxN.N также меняется на каждой итерации.У меня есть некоторые данные y1, y2, ..., yn, поэтому на каждой итерации я делаю какой-то процесс, предлагаю новые значения для параметров и решаю, следует ли перемещать k или нет.

Пока что я привязан к использованиюmalloc и realloc, чтобы справиться со всеми этими изменениями измерения моих параметров, но я должен повторить этот алгоритм, скажем, 100 000 раз, поэтому в определенный момент он падает.Если я начну с k = 10 в моем случае на третьей итерации!

Итак, два вопроса:

  • Могу ли я использовать realloc на каждой итерации?или это моя большая ошибкаЕсли да, то я полагаю, что должен проверить мой код!
  • Если нет, то что мне делать, любое предложение?

1 Ответ

4 голосов
/ 27 мая 2011

Я бы рассмотрел , а не , изменяя хранилище на каждой итерации. realloc несет значительные накладные расходы (в худшем случае он должен копировать весь ваш массив каждый раз).

Можете ли вы просто выделить максимальные размеры при запуске, а затем просто использовать их меньше? Или, по крайней мере, только realloc при увеличении требований к хранилищу за счет удвоения вашей емкости (таким образом, имитируя работу std::vector).

[Между прочим, я не знаю, почему происходит сбой вашего приложения, поскольку вы не предоставили нам никаких подробностей (например, сообщение об ошибке, которое вы получили, или то, что вы обнаружили при отладке. Но я думаю, у вас где-то есть ошибка!]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...