Как найти определенную ячейку в массиве ячеек?

Допустим, у меня есть массив ячеек, содержащий ячейки 1x2. например. deck = {{4,'c'},{6,'s'}...{13,'c'}...{6,'d'}}

Как я могу найти индекс конкретной ячейки? Например, я хочу найти индекс ячейки со значениями {13,'c'}.

Спасибо!


person user4098307    schedule 02.01.2015    source источник


Ответы (2)


Другой способ, который я могу предложить, — работать с каждым столбцом отдельно. Мы могли бы использовать логические операторы в каждом столбце для поиска карт в вашем массиве ячеек, которые содержат определенное число в первом столбце, за которым следует определенная масть во втором столбце. Чтобы обозначить совпадение, мы должны проверить, где пересекаются эти два выхода. Мы можем сделать это, объединив оба вывода с логическим AND, когда закончим:

deck = {{4,'c'},{6,'s'},{13,'c'},{6,'d'}};
target_card = {13, 'c'};

deck_unroll = vertcat(deck{:});    
a1 = cat(1, deck_unroll{:,1}) == target_card{1};
a2 = cat(1, deck_unroll{:,2}) == target_card{2};
found = a1 & a2  

found =

     0
     0
     1
     0

Поскольку deck — это вложенный массив ячеек, я развернул его так, чтобы он стал двумерным массивом ячеек, где каждая строка обозначает одну карту. Это хранится в deck_unroll. Как только я это сделаю, я дополнительно разворачиваю ячейки, чтобы первый столбец помещался в числовой массив, и мы искали определенное число (13 в вашем примере), а второй столбец помещался в массив строк, где мы ищем определенный символ ('c' в вашем примере). Это делается с помощью cat для извлечения каждого элемента из определенного столбец, и мы строим массив из этих элементов.

person rayryeng    schedule 02.01.2015

Попробуйте cellfun с isequal:

>> deck = {{4,'c'},{6,'s'},{13,'c'},{6,'d'}};
>> targetCell = {13,'c'};
>> found = cellfun(@(c) isequal(c,targetCell),deck)
found =
     0     0     1     0

cellfun давай проверяй как хочешь (не только isequal). Например, если вы хотите проверить на основе строкового элемента в каждой ячейке:

>> targetLetter = 'c';
>> found = cellfun(@(c) strcmp(c{2},targetLetter),deck)
found =
     1     0     1     0
person chappjc    schedule 02.01.2015
comment
Отличная работа с isequal! - person rayryeng; 03.01.2015