exponenta event banner

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

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

При создании категориального массива с помощью 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
     medium 
     large 
     small 
     small 
     medium 
     large 
     medium 
     large 
     medium 
     small 

A является категориальным массивом 10 на 1.

Отображение категорий A.

categories(A)
ans = 3x1 cell
    {'small' }
    {'medium'}
    {'large' }

Убедитесь, что категории защищены

При создании массива порядковых категорий категории всегда защищены.

Используйте isprotected для проверки того, что категории A защищены.

tf = isprotected(A)
tf = logical
   1

Категории A защищены.

Присвоить значение в новой категории

При попытке присвоить новое значение, не принадлежащее к одной из существующих категорий, MATLAB ® возвращает ошибку. Например, нельзя присвоить значение'xlarge' к категориальному массиву, как в выражении A(2) = 'xlarge', потому что xlarge не является категорией A. Вместо этого 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
     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
     small 
     xsmall 
     xsmall 
     small 
     small 

B является категориальным массивом 5 на 1 с двумя категориями, такими, что xsmall < small.

Для объединения двух порядковых категориальных массивов (которые всегда имеют защищенные категории) они должны иметь одинаковые категории, и категории должны быть в одном порядке.

Добавить категорию 'xsmall' кому A перед категорией 'small'.

A = addcats(A,'xsmall','Before','small');

categories(A)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

Добавить категории {'medium','large','xlarge'} кому B после категории 'small'.

B = addcats(B,{'medium','large','xlarge'},'After','small');

categories(B)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

Категории A и B теперь те же, включая их порядок.

Вертикальная конкатенация A и B.

C = [A;B]
C = 15x1 categorical
     medium 
     xlarge 
     small 
     small 
     medium 
     large 
     medium 
     large 
     medium 
     small 
     small 
     xsmall 
     xsmall 
     small 
     small 

Значения из B добавляются к значениям из A.

Перечислить категории C.

categories(C)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

C является порядковым категориальным массивом 16 на 1 с пятью категориями, таким образом, что xsmall < small < medium < large < xlarge.

См. также

| | | | |

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

Подробнее