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