MATLAB在结构中搜索包含另一个字符串的项目

时间:2014-05-20 14:08:15

标签: matlab search struct find

我有一个非常简单的问题,但不知何故我无法在谷歌和matlab的帮助中找到答案。 所以我有2个文件夹,每个文件夹有200个文件,以某种模式命名。第一个文件夹包含文件,每个文件在另一个文件夹中都有相应的文件。 例如一对文件:

Folder1: 2014-02-25_001_140225_111946 FFlC-1-1-100-0,55-114-315-0-3cm rms 2k.png

Folder2: Date=140225_Time=112038 FFlC-1-1-100-0,55-114-315-0-3cm avg 4k.jpg

两个文件的FFlC-1-1...-3cm部分相同。

所以我用dir将目录内容读入2个结构,然后我可以将第一个文件名中的公共部分分成一个字符串。

但是如何在其他目录中的文件名中搜索此字符串? 换句话说,如何在结构中搜索srting?

Filenames1=dir('....\photos1\*.png')
Filenames2=dir('....\photos2\*.jpg')

for i=1, length(Filenames1)

    string=Filenames1(i).name(30:60)
    pic= Filenames_2(find(string))  <-- but this does not work.

end

嗯,实际上它有效,但是它不是1个文件名,而是给我31个(1个正确,30个不正确)。看起来不是使用整个字符串('FFlC-1-1-100-0,55-114-315-0-3cm'),而是使用逗号之前的部分('FFlC-1-1-100-0 “)。

2 个答案:

答案 0 :(得分:0)

您正在寻找的功能是strfind(str, pattern),在您的情况下,如果我理解它,一个想法是:

%... loop over all elements in *Filenames1*
pattern=Filenames1(ii).name(30:60);
%... start a loop over *Filenames_2*
str=Filenames_2(jj).name;
Matches(ii,jj)=strfind(str, pattern) %don't forget to initialize *Matches*
%...
close loops

现在Matches具有找到字符串的位置,如果不是,则为空值。

using i and j as variables in MatLab

答案 1 :(得分:0)

您可以将文件名从结构中弹出到单元格数组中,然后使用strcmpismemberregexp或其他矢量化比较,避免内部循环。诀窍是使用{ s.field }语法从.name返回的结构数组中提取dir()字段。

names2 = { Filenames2.name };

我实际上会先解析第二个目录中的文件名,这样你就可以使用精确的相等比较而不是子串搜索。

Filenames1=dir('....\photos1\*.png')
Filenames2=dir('....\photos2\*.jpg')

% Extract just the names from the second dir listing
names2 = { Filenames2.name };
% parse them: fixed-width records work well as 2-D char arrays
namesTmp = char(names2);
ids2 = cellstr(namesTmp(:, 26:55));

for i=1:numel(Filenames1)
    id=Filenames1(i).name(30:60)
    % Then use exact comparison
    ix = find(strcmp(id, ids2))
    matchingFile = names2{ix}
end