2013-03-24 80 views
1

我有一个单元格数组,它是文件名列表。我转换了他们,因为我发现更容易处理。现在我正在尝试遍历每个单元格中的每一行,并根据其文件扩展名删除这些行。最后,我想用这个列表作为文件名来从中导入数据。这是我转列表从单元阵列扫描数据并根据文件扩展名移除

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

我使用的尝试,并在每个单元中读取数据的代码一直给我的错误输入必须是double类型或字符串。有任何想法吗?

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。 EDIT2:适用于F卫生组织是

Name  Size    Bytes Class Attributes 
b   1x11   13986188 cell 

而对于是

Name  Size    Bytes Class Attributes 
a   1x1    118408 cell 
+0

这是Matlab的? – 2013-03-24 20:23:11

+0

好吧,我为你的问题添加了matlab标签。这将有助于让合适的人看到它。 – 2013-03-24 21:16:36

+0

您可以在命令提示符处输入whos F以及在运行代码之后输入谁的结果添加到您的文章中? – grantnz 2013-03-24 21:23:06

回答

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; 
1

从你的描述我不能肯定你F阵列的外观,但假设

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

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

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

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