如何在单元格数组中找到特定单元格?

时间:2015-01-02 18:14:40

标签: matlab indexing cell-array

假设我有一个包含1x2个单元格的单元格数组。例如。 deck = {{4,'c'},{6,'s'}...{13,'c'}...{6,'d'}}

如何找到特定单元格的索引?例如,我想找到值为{13,'c'}的单元格的索引。

谢谢!

2 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分: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是一个嵌套的单元格数组,所以我展开它以使它成为一个2D单元格数组,其中每一行代表一张卡片。这存储在deck_unroll中。一旦我这样做,我进一步展开单元格,以便第一列放入一个数字数组,我们搜索一个特定的数字(在你的例子中为13),第二列放入一个字符串数组,我们搜索一个特定的数字字符(示例中为'c')。这是在cat的帮助下完成的,以从特定列中提取每个元素,并从这些元素中构造一个数组。