以递归方式消除单元格数组中的数字

时间:2015-05-20 22:21:25

标签: arrays matlab cell-array

我一直在做家庭作业(这只是一部分),我必须递归地处理单元格数组,例如:

{1,{2,{5,{6,{}}}}}

我需要根据属性消除对象,即:

p=@(x)(x<3)

函数名称为filter_list(list,p),使用它的结果应为:

{1,{2,{}}}

代码是:

function [ list ] = filter_list( list,p )
if isempty(list)==1
    disp('holo');
    return;
else
    if p(list{1})==0
        disp('hola');
        list(1)=list{2}(1);
        list(2)=list{2}(2);
        list{2}=filter_list(list{2},p);
    else
        disp('hele')
        list{2}=filter_list(list{2},p);
    end        
end

但我得到的代码是:

{1,{2,{6,{}}}}

它只消除满足以下内容的数组的第一个元素:

p(list{1}) == 0

要求。

我该怎么做才能解决这个问题?另外,如果我使用大于4的数组,它也会崩溃。

2 个答案:

答案 0 :(得分:1)

您需要递归调用该函数,

function [ list ] = filter_list( list,p )
    for i = numel(list):-1:1 %Go through the cell backwards
        if ~iscell(list{i}) %if the cell contains a scalar, vector or matrix
            list{i}(~p(list{i})) = []; %if the number does not follow the rule specified by p remove it
            if isempty(list{i}) %if there is nothing in the scalar/vector/matrix remove it
                list(i) = [];
            end
        else %if the cell doesn't contain a number call the function again
            list{i} = filter_list(list{i}, p);
        end
    end
end

答案 1 :(得分:1)

从列表中删除第一个元素的部分不正确。

而不是

list(1)=list{2}(1);
list(2)=list{2}(2);
list{2}=filter_list(list{2},p);

您应该使用:

list = filter_list(list{2},p);

如果你采用整体方法,可能会更清楚:

function list = filter_list(list, p)
if ~isempty(list)
    if p(list{1}) 
        list = {list{1}, filter_list(list{2}, p)}; %// Keep head of list
    else
        list = filter_list(list{2}, p);            %// Only keep filtered tail
    end
end
end