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

How to find an matching element (either number or string) in a multi level cell?

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

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

。但是,此解决方案仅适用于要在单元格中查找数字值的情况。对于数字和字符串,我都需要一个解决方案。 所需的输出应为 1 或 0(值在或不在单元格 A 中)和找到匹配元素的单元格 level/deepness。

对于您的示例输入,您可以通过将 中的 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 元素调用。如果您希望能够搜索 NaN 个值,请使用 isequaln

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

>> 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,因为 ||&& 的 'short-circuiting' 行为。最后一个解决方案在如何将字符串与字符向量匹配方面仍然有点不一致,以防万一这对您很重要 - 看看您是否能想出解决方法。