Как конкатенация и индексирование отличаются для ячеек и массивов в MATLAB? - PullRequest
4 голосов
/ 18 апреля 2010

Я немного озадачен использованием ячеек и массивов в 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.
    

Это правильно? Какие еще существуют различия между ячейками и массивом?

Ответы [ 2 ]

12 голосов
/ 18 апреля 2010

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

  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'.

4 голосов
/ 18 апреля 2010

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

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

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

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

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

...