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

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

Ввод в серии чисел, разделенных запятыми, дает вам, что называется списком, разделенным запятыми. 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} переменным c1, c2 и 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

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

Была ли эта тема полезной?