如何在多级单元格中找到匹配的元素数字或字符串?

问题描述

我正在尝试在元胞数组的一个元胞中搜索匹配的数字(例如,2)或字符串('text')。单元格示例:

 A = {1 {2; 3};4 {5 'text' 7;8 9 10}};

There is similar question。但是,此解决方案仅适用于您想在单元格中查找数字值的情况。对于数字和字符串,我都需要一个解决方案。 所需的输出应该是 1 或 0(值在或不在单元格 A 中)以及找到匹配元素的单元格级别/深度。

解决方法

对于您的示例输入,您可以通过将 linked solution 中的 ismember 替换为 isequal 来匹配字符向量和数字。您可以通过跟踪函数必须绕过 while 循环的次数来获得找到搜索值的深度。

function [isPresent,depth] = is_in_cell(cellArray,value)

    depth = 1;
    f = @(c) isequal(value,c);
    cellIndex = cellfun(@iscell,cellArray);
    isPresent = any(cellfun(f,cellArray(~cellIndex)));

    while ~isPresent
        depth = depth + 1;
        cellArray = [cellArray{cellIndex}];
        cellIndex = cellfun(@iscell,cellArray);
        isPresent = any(cellfun(f,cellArray(~cellIndex)));
        if ~any(cellIndex)
            break
        end
    end

end

使用 isequal 是有效的,因为 f 只被调用 cellArray 的元素,这些元素本身不是元胞数组。如果您希望能够搜索 isequaln 值,请使用 NaN

注意现在不会搜索内部数字、逻辑或字符串数​​组:

>> A = {1 {2; 3};4 {5 'text' 7;8 9 [10 11 12]}};
>> is_in_cell(A,10)
ans =
  logical
   0

如果需要,可以将 f 定义为

f = @(c) isequal(value,c) || isequal(class(value),class(c)) && ismember(value,c);

避免使用不兼容的数据类型调用 ismember,因为 ||&& 的“短路”行为。最后一个解决方案在如何将字符串与字符向量匹配方面仍然有点不一致,以防万一这对您很重要 - 看看您是否能弄清楚如何解决这个问题。