【发布时间】:2015-03-01 01:08:59
【问题描述】:
假设我有一个包含 1x2 单元格的单元格数组。例如。 deck = {{4,'c'},{6,'s'}...{13,'c'}...{6,'d'}}
如何找到特定单元格的索引?例如,我想找到值为{13,'c'} 的单元格的索引。
谢谢!
【问题讨论】:
标签: matlab indexing cell-array
假设我有一个包含 1x2 单元格的单元格数组。例如。 deck = {{4,'c'},{6,'s'}...{13,'c'}...{6,'d'}}
如何找到特定单元格的索引?例如,我想找到值为{13,'c'} 的单元格的索引。
谢谢!
【问题讨论】:
标签: matlab indexing cell-array
>> 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
【讨论】:
isequal 做得很好!
我可以建议的另一种方法是分别对每一列进行操作。我们可以在每一列上使用逻辑运算符来搜索单元格数组中的卡片,这些卡片在第一列中包含特定数字,然后在第二列中包含特定花色。为了表示匹配,我们将检查这两个输出相交的位置。完成后,我们可以通过将两个输出与逻辑 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 的帮助下完成的,从特定列中提取每个元素,然后我们用这些元素构造一个数组。
【讨论】: