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