2013-08-12 4 views
2

В Matlab У меня есть простая структура, и я хотел бы построить массив этой структуры (я знаю, как это сделать). Мой вопрос: есть ли способ просто вставить элемент в этот массив , не указывая массив в котором позиция это должно быть? Что-то похожее на функцию «push_back» в C++, которая просто помещает ваш элемент в конец вектора, существует в языке Matlab?Элемент Push_back в Matlab Struct

ответ

2

Вы можете использовать индексацию в сочетании с end

a_struct = struct('x', 1); 
a_struct(end+1) = struct('x', 2); % this writes the element to the `end+1`'th-position 
disp(a_struct) 

Дам вам:

1x2 struct array with fields: 
    x 

Примечания хотя, что под капотом нет Предварительного выделения вообще, как там может быть для с векторами ++ и т.д. Таким образом, каждое присвоение end+1 приведет к созданию копии старой структуры с помощью одного дополнительного элемента. См., Например, http://blogs.mathworks.com/loren/2008/02/01/structure-initialization/#7 для комментариев по этому вопросу.

0

Похоже, вы хотите итеративно расширять массив (вектор). Это очень неэффективно в MATLAB, так как это приведет к большому количеству перераспределений по мере роста вектора.

В MATLAB лучше выделить вектор заранее (нужного размера) и проиндексировать его напрямую, либо использовать arrayfun для построения массива.

Это точно такая же проблема, как и в «s std::vector, где она много лучше выделить один раз, а затем использовать std::back_inserter по сравнению с push_back().

+0

Хорошо, но я не знаю размер вектора. Но представьте, что вы предустановили, есть ли простой и чистый способ просто вставить еще один элемент (в конце/на переднем плане, мне действительно все равно) в этот вектор? – karl71

+0

'foo (end + 1) = bar;' должен делать трюк. Но имейте в виду, что это приводит к перераспределению по мере изменения размера вектора. Если вы хотите выделить один раз, вы должны знать правильный размер и использовать индексы между «1: end». –

+0

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

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