从单元阵列扫描数据并根据文件扩展名删除

时间:2013-03-24 20:16:52

标签: matlab cell-array textscan

我有一个单元格数组,它是一个文件名列表。我转换它们是因为我发现它更容易使用。现在我试图遍历每个单元格中的每一行,并根据文件扩展名删除这些行。最后,我想使用此列表作为文件名来从中导入数据。这就是我转置列表的方式

 for i = 1:numel(F);
    a = F(1,i);
    b{i} = [a{:}'];
 end;

我用来尝试读取每个单元格中的数据的代码一直给我错误输入必须是double或string类型。有什么想法吗?

for i = 1:numel(b);
    for k = 1:numel(b{1,i});
        b(cellfun(textscan(b{1,i}(k,1),'%s.lbl',numel(b)),b))=[];
    end;
end;

提前致谢。

编辑:这是针对MATLAB的。应该是清楚的。谢谢Brian。 编辑2:F的原因是

Name      Size               Bytes  Class    Attributes
b         1x11            13986188  cell 

而a是

 Name      Size             Bytes  Class    Attributes
 a         1x1             118408  cell

2 个答案:

答案 0 :(得分:1)

根据您的描述,我不确定您的F数组看起来如何,但假设

F = {'file1.ext1', 'file2.ext2', 'file3.ext2', 'file2.ext1'};

您可以删除所有以.ext2结尾的文件,如下所示:

F = F(cellfun('isempty', regexpi(F, '\.ext2$')));

regexpi对单元数组中的每个元素进行操作,对所有与表达式不匹配的文件返回[]cellfun调用将单元格数组转换为逻辑数组,其中false位置对应于以.ext2结尾的文件,true用于所有其他位置。生成的数组可以用作F的逻辑索引,返回应保留的文件。

答案 1 :(得分:0)

你使用的是cellfun错误。它的签名是[A1,...,Am] = cellfun(func,C1,...,Cn)。它需要一个函数作为第一个参数,但是你传递的是textscan的结果,它是匹配字符串的单元格数组。第二个参数应该是一个单元格数组,但是在循环中反复调用它是没有意义的。 `cellfun'的工作是当你想对单元格数组中的每个单元做同样的事情时为你编写循环。

我建议您使用fileparts

,而不是使用textscan自行解析文件名

由于您已经在转置步骤中循环遍历单元阵列,因此在那里进行过滤可能是有意义的。它可能看起来像这样:

for i = 1:numel(F);
    a = F(1,i);
    [~,~,ext] = fileparts(a{:});
    if strcmpi(ext, '.lbl')
        b{i} = [a{:}'];
    end
end;