2015-05-13 2 views
4

Я перешел от сбора результатов моих симуляций Matlab в структурах для их сбора в таблицах. Я очень доволен этим способом представления данных, но я все еще не уверен, как обрабатывать предварительное распределение памяти. Если я просто добавлю строки в нижнюю часть таблицы, у меня возникает известная проблема перераспределения всех переменных, включенных в таблицу на каждой итерации.Предварительное распределение памяти для таблиц Matlab без учета?

Я могу предварительно выделить какое-то произвольное количество строк и при окончании моего скрипта обрезать таблицу. Но если я это сделаю, мне нужно зарезервировать количество строк, содержащих фактические данные. Это число должно учитываться при любой операции над табличными значениями, и это избавляет от красоты использования этого объекта высокого уровня.

Есть ли способ предопределить память для таблицы Matlab, которая не изменит поведение таблицы и не требует внешней бухгалтерии?

Edit - осветление

Мой вопрос относится не только к таблицам, но и к любому переменному классу Matlab. Я предопределял переменные Matlab в течение многих лет, это расстраивает то, что нет эффективного однострочного интерфейса, который добавляет данные без дополнительного управления. Я ожидал бы, что по крайней мере объект таблицы будет включать некоторое умное решение для управления памятью. На мой взгляд, добавление нулевых строк во избежание перераспределения не имеет места в научном коде (который должен быть как можно более абстрактным).

+1

Будет ли такая же проблема существовать, если вы просто имеете все переменные отдельно и создаете таблицу только после того, как закончите работу с данными? –

+0

Мне все равно придется записывать количество «заполненных» записей в каждом векторе, это было бы не менее громоздко. – Tal

+1

Хотя то, что вы хотите, очень разумно, кажется немного противоречивым. Если вы предварительно выделите, я не вижу, как вы можете избежать необходимости отслеживать количество используемых записей. Один из подходов состоял бы в том, чтобы предварительно распределить значения «NaN», а затем использовать такие функции, как «nansum» или «nanmean», которые игнорируют «NaN». Но, конечно, эти функции игнорируют «NaN», используя некоторую внутреннюю предварительную обработку (например, 'nansum' просто делает их равными нулю перед суммированием). Таким образом, у вас все еще есть какая-то «на лету» бухгалтерская документация –

ответ

0

Вы можете создать свой собственный класс переменной/таблицы для достижения того, что вы ищете, но, честно говоря, гораздо проще просто работать с использованием решения, которое вы уже предложили, а именно, используя дополнительную счетную переменную чтобы отслеживать, где вы находитесь.

Я понимаю ваше разочарование в том, что нет «более чистого» способа, но на самом деле это не так громоздко, и любое потенциальное «умное» решение будет хорошо работать для некоторых людей, а не для других, будь то по соображениям эффективности или иным образом. Плюс, я думаю, во многих случаях счетчик уже встроен в петлю:

A = zeros(2000, 1); 
for i = 1:N 
    A(i) = i^2; 
    % i is the number of rows filled so far... 
end 
Смежные вопросы