1

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

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

我用来尝试读取每个单元格中的数据的代码不断给我错误输入必须是双精度或字符串类型。有任何想法吗?

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 的。应该清楚这一点。谢谢布赖恩。EDIT2:谁为 F 是

Name      Size               Bytes  Class    Attributes
b         1x11            13986188  cell 

而对于 a 是

 Name      Size             Bytes  Class    Attributes
 a         1x1             118408  cell
4

2 回答 2

1

根据您的描述,我不确定您的F阵列的外观,但假设

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

.ext2您可以删除所有以这样结尾的文件:

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

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

于 2013-03-24T21:57:59.817 回答
0

你用错了cellfun。它的签名是[A1,...,Am] = cellfun(func,C1,...,Cn)。它接受一个函数作为第一个参数,但您将 textscan 的结果传递给它,这是一个匹配字符串的元胞数组。第二个参数应该是一个元胞数组,但是在循环中一遍又一遍地调用它是没有意义的。`cellfun' 的工作是在您想对单元阵列中的每个单元执行相同的操作时为您编写循环。

我建议您不要使用 textscan 自己解析文件名,而是使用fileparts

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

for i = 1:numel(F);
    a = F(1,i);
    [~,~,ext] = fileparts(a{:});
    if strcmpi(ext, '.lbl')
        b{i} = [a{:}'];
    end
end;
于 2013-03-24T21:52:13.120 回答