Чем конкатенация и индексация отличаются для ячеек и массивов в MATLAB?

Я немного запутался в использовании ячеек и массивов в MATLAB и хотел бы уточнить некоторые моменты. Вот мои наблюдения:

  1. Массив может динамически регулировать свою собственную память, чтобы обеспечить динамическое количество элементов, в то время как ячейки, похоже, не действуют таким же образом:

    a=[]; a=[a 1]; b={}; b={b 1};
    
  2. Несколько элементов можно получить из ячеек, но не похоже, что они могут быть из массивов:

    a={'1' '2'}; figure; plot(...); hold on; plot(...); legend(a{1:2});   
    b=['1' '2']; figure; plot(...); hold on; plot(...); legend(b(1:2));
    %# b(1:2) is an array, not its elements, so it is wrong with legend.
    

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


person Tim    schedule 18.04.2010    source источник


Ответы (2)


массивы ячеек могут быть немного сложными, так как вы можете использовать [], (), и {} синтаксиса по-разному для создание, объединение и индексирование их, хотя каждый из них делает разные вещи. Обращаясь к двум вашим пунктам:

  1. Чтобы увеличить массив ячеек, вы можете использовать один из следующих синтаксисов:

    b = [b {1}];     % Make a cell with 1 in it, and append it to the existing
                     %   cell array b using []
    b = {b{:} 1};    % Get the contents of the cell array as a comma-separated
                     %   list, then regroup them into a cell array along with a
                     %   new value 1
    b{end+1} = 1;    % Append a new cell to the end of b using {}
    b(end+1) = {1};  % Append a new cell to the end of b using ()
    
  2. Когда вы индексируете массив ячеек с помощью (), он возвращает подмножество ячеек в массиве ячеек. Когда вы индексируете массив ячеек с помощью {}, он возвращает запятую. разделенный список содержимого ячейки. Например:

    b = {1 2 3 4 5};  % A 1-by-5 cell array
    c = b(2:4);       % A 1-by-3 cell array, equivalent to {2 3 4}
    d = [b{2:4}];     % A 1-by-3 numeric array, equivalent to [2 3 4]
    

    Для d синтаксис {} извлекает содержимое ячеек 2, 3 и 4 в виде список, разделенный запятыми, затем использует [] для сбора этих значений в числовой массив. Следовательно, b{2:4} эквивалентно написанию b{2}, b{3}, b{4} или 2, 3, 4.

    Что касается вашего вызова legend, синтаксис legend(a{1:2}) эквивалентен legend(a{1}, a{2}) или legend('1', '2'). Таким образом, два аргумента (два отдельных символа) передаются в legend. Синтаксис legend(b(1:2)) передает один аргумент, который представляет собой строку 1 на 2 '12'.

person gnovice    schedule 18.04.2010

Каждый массив ячеек является массивом! Из этого ответа:

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

Пример: [1,2,3,4]

{} — это тип. Представьте, что вы хотите поместить в массив элементы разного типа — число и строку. Это возможно с помощью трюка - сначала поместить каждый элемент в контейнер {}, а затем сделать массив из этих контейнеров - массив ячеек.

Пример: [{1},{'Hallo'}] с сокращенной записью {1, 'Hallo'}

person Mikhail    schedule 18.04.2010