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

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

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

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

| | | | |

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

Больше о