我有一个单元格数组,它是一个文件名列表。我转换它们是因为我发现它更容易使用。现在我试图遍历每个单元格中的每一行,并根据文件扩展名删除这些行。最后,我想使用此列表作为文件名来从中导入数据。这就是我转置列表的方式
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
答案 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
由于您已经在转置步骤中循环遍历单元阵列,因此在那里进行过滤可能是有意义的。它可能看起来像这样:
for i = 1:numel(F);
a = F(1,i);
[~,~,ext] = fileparts(a{:});
if strcmpi(ext, '.lbl')
b{i} = [a{:}'];
end
end;