Ввод ряда чисел, разделенных запятыми, дает вам то, что называется разделенным списками , разделенными запятыми. 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
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
Другим способом обработки этого без списка , разделенного запятыми было бы закольцовывание каждой размерности, преобразование одной размерности за раз и перемещение данных каждый раз. С разделенным списками , разделенными запятыми вы перемещаете данные всего один раз. Разделенный списками , разделенными запятыми очень облегчает обобщение операции замены на произвольное количество размерностей.