Работа с защищенными Категориальными массивами

В этом примере показано, как работать с категориальным массивом с защищенными категориями.

Когда вы создаете категориальный массив с 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.

Смотрите также

| | | | |

Связанные примеры

Больше о