【问题标题】:How can I check whether an element is in a nested cell array?如何检查元素是否在嵌套元胞数组中?
【发布时间】:2023-03-05 06:09:02
【问题描述】:

如何检查元素是否在嵌套元胞数组中? 例如:

A = {{4 5 6};{6 7 8}};
b = 5;

功能

ismember(b,A{1})

不起作用。 有没有比for循环更好的解决方案?

【问题讨论】:

  • 你的细胞结构有两层深。如果您要获取数值,则需要执行 ismember(b, A{1}{1})
  • 你能给我们更多关于你的数据结构的信息吗?那些内部单元格数组是否总是 3 个元素长?嵌套深度是否始终相同?
  • 您是否总是与一个特定值或参考值列表进行比较?也就是说,b(您要搜索的值)是否始终为 1 长?

标签: arrays matlab cell-array


【解决方案1】:

因为每个元素都是一个单元格,所以您别无选择,只能使用cellfunismember 结合使用,这在任何情况下都与使用循环相同。你的细胞特别深两层(根据 Andrew Janke)。元胞数组中的每个元胞元素都是另一个单个元素的元胞数组,因此没有矢量化解决方案可以帮助您解决这个问题。

假设每个单元格只是单个元素的一维单元格数组,您可以这样做:

A = {{4 5 6};{6 7 8}};
b = 5;
out = cellfun(@(x) ismember(b, cell2mat(x)), A);

这给了我们:

out =

     1
     0

这将检查值b 是否在每个嵌套元胞数组中。如果您打算简单地检查它在整个嵌套元胞数组中是否存在,请在输出中使用any,等等:

out = any(cellfun(@(x) ismember(b, cell2mat(x)), A));

因为每个单元格元素都是单个元素的单元格数组,所以我在调用 ismember 之前通过 cell2mat 将它们转换为数值向量。

【讨论】:

  • 如果 A = {1 {1 2 3};2 {4 5 6};3 {7}} 问题如何解决?
  • 啊,这不是您最初问题的一部分。所以你是说你的元胞数组可以是非元胞和元胞的混合体?
  • 是的,完全正确。我原来的问题已经解决了,但这是另一个问题!
  • @mona - 你也许应该提出另一个问题。这需要大量额外的工作,不值得简单地编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多