Списки, разделенные запятыми

Что такое список, разделенный запятыми?

Ввод в серии чисел, разделенных запятыми, дает вам, что называется списком, разделенным запятыми. MATLAB возвращает каждое значение индивидуально:

1,2,3
ans =

     1


ans =

     2


ans =

     3

Такой список, отдельно, не очень полезен. Но, когда используется со структурами больших и более комплексных данных как структуры MATLAB и массивы ячеек, список, разделенный запятыми может позволить вам упростить свой код MATLAB.

Генерация списка, разделенного запятыми

В этом разделе описывается сгенерировать список, разделенный запятыми или от массива ячеек или от структуры MATLAB.

Генерация списка от массива ячеек

Извлечение нескольких элементов от массива ячеек дает к списку, разделенному запятыми. Учитывая 4 6 массив ячеек как показано здесь

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
C
C = 

    [2]    [10]    [18]    [26]    [34]    [42]
    [4]    [12]    [20]    [28]    [36]    [44]
    [6]    [14]    [22]    [30]    [38]    [46]
    [8]    [16]    [24]    [32]    [40]    [48]

извлечение пятой колонны генерирует следующий список, разделенный запятыми:

C{:,5}
ans =

    34


ans =

    36


ans =

    38


ans =

    40

Это совпадает с явным образом вводом

C{1,5},C{2,5},C{3,5},C{4,5}

Генерация списка от структуры

Для структур, извлекая поле структуры, которая существует через одну из ее размерностей, дает к списку, разделенному запятыми.

Запустите путем преобразования массива ячеек, используемого выше в 4 1 структура MATLAB с шестью полями: f1 через f6. Считайте поле f5 поскольку все строки и MATLAB возвращает список, разделенный запятыми:

S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
S.f5
ans =

    34


ans =

    36


ans =

    38


ans =

    40

Это совпадает с явным образом вводом

S(1).f5,S(2).f5,S(3).f5,S(4).f5

Присвоение Вывода от списка, разделенного запятыми

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

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
[c1,c2,c3,c4,c5,c6] = C{1,1:6};
c5
c5 =

    34
Если вы задаете меньше выходных переменных, чем количество выходных параметров, возвращенных выражением, MATLAB присваивает первый N выходные параметры тем переменным N, и затем отбрасывает любые остающиеся выходные параметры. В этом следующем примере MATLAB присваивает C{1,1:3} к переменным c1C2 , и c3, и затем отбрасывания C{1,4:6}:
[c1,c2,c3] = C{1,1:6};
Можно присвоить структуру выходные параметры таким же образом:
S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
[sf1,sf2,sf3] = S.f5;
sf3
sf3 =

    38
Также можно использовать deal функция с этой целью.

Присвоение списку, разделенному запятыми

Самый простой способ присвоить несколько значений списку, разделенному запятыми состоит в том, чтобы использовать deal функция. Эта функция распределяет все свои входные параметры к элементам списка, разделенного запятыми.

Этот пример использует deal перезаписывать каждый элемент в списке, разделенном запятыми. Сначала создайте список.

c{1} = [31 07]; 
c{2} = [03 78];
c{:}
ans =

    31     7


ans =

     3    78

Используйте deal перезаписывать каждый элемент в списке.

[c{:}] = deal([10 20],[14 12]);
c{:}
ans =

    10    20


ans =

    14    12

Этот пример делает то же самое как то выше, но со списком, разделенным запятыми векторов в поле структуры:

s(1).field1 = [31 07];
s(2).field1 = [03 78];
s.field1
ans =

    31     7


ans =

     3    78

Используйте deal перезаписывать поля структуры.

[s.field1] = deal([10 20],[14 12]);
s.field1
ans =

    10    20


ans =

    14    12

Как использовать списки, разделенные запятыми

Общее использование для списков, разделенных запятыми

Следующие разделы предоставляют примерам использования списков, разделенных запятыми с массивами ячеек. Каждый из этих примеров применяется к структурам MATLAB также.

Построение массивов

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

Когда вы задаете список элементов с C{:, 5}, MATLAB вставляет эти четыре отдельных элемента:

A = {'Hello',C{:,5},magic(4)}
A = 

    'Hello'    [34]    [36]    [38]    [40]    [4x4 double]

Когда вы задаете C сама ячейка, MATLAB вставляет целый массив ячеек:

A = {'Hello',C,magic(4)}
A = 

    'Hello'    {4x6 cell}    [4x4 double]

Отображение массивов

Используйте список, чтобы отобразить все или часть массива структур или массива ячеек:

A{:}
ans =

Hello


ans = 

    [2]    [10]    [18]    [26]    [34]    [42]
    [4]    [12]    [20]    [28]    [36]    [44]
    [6]    [14]    [22]    [30]    [38]    [46]
    [8]    [16]    [24]    [32]    [40]    [48]


ans =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

Конкатенация

Помещение списка, разделенного запятыми в квадратных скобках извлекает указанные элементы из списка и конкатенирует их:

A = [C{:,5:6}]
A =

    34    36    38    40    42    44    46    48

Аргументы вызова функции

При записи кода для вызова функции вы вводите входные параметры как список с каждым аргументом, разделенным запятой. Если вам сохранили эти аргументы в массиве структур или массиве ячеек, то можно сгенерировать все или часть списка аргументов из массива структур или массива ячеек вместо этого. Это может быть особенно полезно при передаче в переменных количествах аргументов.

Этот пример передает несколько аргументов значения атрибута plot функция:

X = -pi:pi/10:pi;
Y = tan(sin(X)) - sin(tan(X));
C = cell(2,3);
C{1,1} = 'LineWidth';
C{2,1} = 2;
C{1,2} = 'MarkerEdgeColor';
C{2,2} = 'k';
C{1,3} = 'MarkerFaceColor';
C{2,3} = 'g';
figure
plot(X,Y,'--rs',C{:})

Функциональные возвращаемые значения

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

Этот пример возвращает три значения к массиву ячеек:

C = cell(1,3);
[C{:}] = fileparts('work/mytests/strArrays.mat')
C = 

    'work/mytests'    'strArrays'    '.mat'

Пример быстрого преобразования Фурье

fftshift функционируйте подкачивает левые и правые половины каждой размерности массива. Для простого вектора, такого как [0 2 4 6 8 10] выходом был бы [6 8 10 0 2 4]. Для многомерного массива, fftshift выполняет эту подкачку по каждому измерению.

fftshift векторы использования индексов, чтобы выполнить подкачку. Для вектора, показанного выше, индекс [1 2 3 4 5 6] перестроен, чтобы сформировать новый индекс [4 5 6 1 2 3]. Функция затем использует этот вектор индекса, чтобы изменить местоположение элементов. Для многомерного массива, fftshift должен создать вектор индекса для каждой размерности. Список, разделенный запятыми делает эту задачу намного более простой.

Вот fftshift функция:

function y = fftshift(x)
    numDims = ndims(x);
    idx = cell(1,numDims);
    for k = 1:numDims
        m = size(x,k);
        p = ceil(m/2);
        idx{k} = [p+1:m 1:p];
    end
    y = x(idx{:});
end

Функция хранит векторы индекса в массиве ячеек idx. Создание этого массива ячеек относительно просто. Для каждого N размерности, определите размер той размерности и найдите целочисленный индекс самым близким средняя точка. Затем создайте вектор, который подкачивает две половины той размерности.

При помощи массива ячеек, чтобы сохранить векторы индекса и список, разделенный запятыми для операции индексации, fftshift массивы сдвигов любой размерности, использующей только одну операцию: y = x(idx{:}). Если бы необходимо было использовать явную индексацию, необходимо было бы записать один if оператор для каждой размерности вы хотите, чтобы функция обработала:

    if ndims(x) == 1
        y = x(index1);
    else if ndims(x) == 2
        y = x(index1,index2);
        end
    end

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