Разделенные запятыми списки

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

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

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

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

Начните, преобразовав массив ячеек, используемый выше, в структуру MATLAB 4 на 1 с шестью полями: 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

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