Этот пример показывает, как работать с категориальным массивом с защищенными категориями.
Когда вы создаете категориальный массив с функцией categorical
, у вас есть опция определения, защищены ли категории. Порядковые категориальные массивы всегда защищали категории, но также можно создать непорядковый категориальный массив, который защищен с помощью аргумента в виде пар "имя-значение" 'Protected',true
.
Когда вы присваиваете значения, которые не находятся в списке массива категорий, обновления массивов автоматически так, чтобы его список категорий включал новые значения. Точно так же можно объединить (непорядковые) категориальные массивы, которые имеют различные категории. Категории в результате включают категории от обоих массивов.
Когда вы присваиваете новые значения защищенному категориальному массиву, значения должны принадлежать одной из существующих категорий. Точно так же можно только объединить защищенные массивы, которые имеют те же категории.
Если вы хотите объединить два непорядковых категориальных массива, которые защитили категории, у них должны быть те же категории, но порядок не имеет значения. Получившийся категориальный массив использует порядок категории от первого массива.
Если вы хотите объединить два порядковых категориальных массива (которые всегда защищали категории), у них должны быть те же категории, включая их порядок.
Чтобы добавить новые категории к массиву, необходимо использовать функциональный addcats
.
Создайте категориальный массив, содержащий размеры 10 объектов. Используйте имена small
, medium
и large
для значений 'S'
, 'M'
и 'L'
.
A = categorical({'M';'L';'S';'S';'M';'L';'M';'L';'M';'S'},... {'S','M','L'},{'small','medium','large'},'Ordinal',true)
A = 10x1 categorical array
medium
large
small
small
medium
large
medium
large
medium
small
A
является категориальным массивом 10 на 1.
Отобразите категории A
.
categories(A)
ans = 3x1 cell array
{'small' }
{'medium'}
{'large' }
Когда вы создаете порядковый категориальный массив, категории всегда защищаются.
Используйте функцию isprotected
, чтобы проверить, что категории A защищены.
tf = isprotected(A)
tf = logical
1
Категории A
защищены.
При попытке присвоить новое значение, которое не принадлежит одной из существующих категорий, то MATLAB® возвращает ошибку. Например, вы не можете присвоить значение 'xlarge'
категориальному массиву, как в выражении A(2) = 'xlarge'
, потому что xlarge
не является категорией A
. Instead, MATLAB® возвращает ошибку:
Error using categorical/subsasgn (line 68)
Cannot add a new category 'xlarge' to this categorical array
because its categories are protected. Use ADDCATS to
add the new category.
Чтобы добавить новую категорию для xlarge
, используйте функцию addcats
. Поскольку A
является порядковым, необходимо задать порядок для новой категории.
A = addcats(A,'xlarge','After','large');
Теперь, присвойте значение для 'xlarge'
, поскольку он имеет существующую категорию.
A(2) = 'xlarge'
A = 10x1 categorical array
medium
xlarge
small
small
medium
large
medium
large
medium
small
A
является теперь категориальным массивом 10 на 1 с четырьмя категориями, такими что small < medium < large < xlarge
.
Создайте другой порядковый категориальный массив, B
, содержа размеры пяти элементов.
B = categorical([2;1;1;2;2],1:2,{'xsmall','small'},'Ordinal',true)
B = 5x1 categorical array
small
xsmall
xsmall
small
small
B
является категориальным массивом 5 на 1 с двумя категориями, таким образом что xsmall < small
.
Чтобы объединить два порядковых категориальных массива (которые всегда защищали категории), у них должны быть те же категории, и категории должны быть в том же порядке.
Добавьте категорию 'xsmall'
к A
перед категорией 'small'
.
A = addcats(A,'xsmall','Before','small'); categories(A)
ans = 5x1 cell array
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
Добавьте категории {'medium','large','xlarge'}
к B
после категории 'small'
.
B = addcats(B,{'medium','large','xlarge'},'After','small'); categories(B)
ans = 5x1 cell array
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
Категории A
и B
являются теперь тем же включая свой порядок.
Вертикально конкатенируйте A
и B
.
C = [A;B]
C = 15x1 categorical array
medium
xlarge
small
small
medium
large
medium
large
medium
small
small
xsmall
xsmall
small
small
Значения от B
добавлены к значениям от A
.
Перечислите категории C
.
categories(C)
ans = 5x1 cell array
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
C
является 16 1 порядковым категориальным массивом с пятью категориями, такими что xsmall < small < medium < large < xlarge
.
addcats
| категориальный
| категории
| isordinal
| isprotected
| сводные данные