Уникальные строки для массива ячеек

Мне интересно, как можно найти уникальные строки массива ячеек, если рассматривать только второй и шестой столбцы.

Пробовал уже так: a = unique(strcat(a(:,2), a(:, 6)),'rows'), где a - массив ячеек, но выдает ошибку - index exceeds matrix dimensions).

Я попытался использовать функции unique и strcat, потому что они работают с переменными типа ячейки как со строками, так и с числами.


person user3557054    schedule 10.08.2014    source источник
comment
Я уже пробовал это: a = unique(strcat(a(:,2), a(:, 6)),'rows'); но выдает ошибку (индекс превышает размеры матрицы)   -  person user3557054    schedule 10.08.2014
comment
Что такое a? Пожалуйста, предоставьте (небольшой) воспроизводимый пример, отредактировав свой вопрос   -  person Luis Mendo    schedule 10.08.2014
comment
@user3557054 user3557054 Сделал несколько правок, пожалуйста, проверьте их, если теперь они имеют больше смысла.   -  person Divakar    schedule 11.08.2014
comment
@user3557054 user3557054 Также, как упоминалось в решении Денниса, поскольку вы упомянули - index exceeds matrix dimensions), вам нужно проверить, есть ли у вас согласованные данные в столбцах 2 и 6.   -  person Divakar    schedule 11.08.2014


Ответы (2)


Предполагая, что a является массивом ячеек и что вы хотите найти уникальные строки из него на основе ячеек столбца 2 и 6. Для того же можно предложить один подход, основанный на нескольких unique использованиях, как показано ниже:

[~,~,ind1] = unique(cellfun(@num2str,a(:,2),'uni',0)) %//unique indices for col 2
[~,~,ind2] = unique(cellfun(@num2str,a(:,6),'uni',0)) %//unique indices for col 6
[~,ind]= unique([ind1 ind2],'rows','stable')%//unique row indices based on col2,6
a = a(ind,:)

Еще один способ сбрить один unique -

col26 = cellfun(@num2str,[a(:,2) a(:,6)],'uni',0)
[~,~,unqind26] = unique(col26(:))
col26indexed = reshape(unqind26,size(col26))
[~,ind] = unique(col26indexed,'rows','stable')
a = a(ind,:)

Обратите внимание, что использование num2str вместо unique для массивов ячеек работает только с ячейками строк, поэтому их нужно было преобразовать в strings.

Оба этих подхода будут работать с cell array из numerals или strings или mix of them (при условии, что [0] и '0' одинаковы), но если вы хотите иметь «уникальность» на основе их типов данных, тогда необходимо добавить больше кодов. там, и поскольку этот конкретный случай не упоминается в вопросе, он здесь не рассматривается.

Кроме того, я не думаю, что вам нужно использовать здесь strcat, насколько я понял, прочитав текст вопроса.

person Divakar    schedule 10.08.2014
comment
Я согласен с тем, что strcat не кажется необходимым, но похоже, что решение не работает или не объясняет ошибку. Попробуйте это с этим массивом ячеек: a = cell(6); a(:)={0}; a(1,2)={1} - person Dennis Jaheruddin; 11.08.2014
comment
@DennisJaheruddin Спасибо! Это была хорошая ошибка, так как я пропустил тестирование с cell array of numerals, которое теперь исправлено! - person Divakar; 11.08.2014

Я вижу здесь только три возможных способа генерировать ошибку, которую вы получаете.

  1. Переменная a слишком мала или вызвана неправильно. Проверьте это, запустив a(:,6) отдельно.
  2. Случайно вы создали переменную с именем strcat
  3. Случайно вы создали переменную с именем unique

Я не уверен, действительно ли 2 и 3 могут привести к ошибке, которую вы получаете, но номер 1 является наиболее вероятным подозреваемым.

person Dennis Jaheruddin    schedule 11.08.2014