首先声明任务:数据按照图片名称分为训练和测试,但是提取特征的时候是按照全部的图片提取vgg_feats.mat
的,有一个task.txt
其中存着所有的图片名字,每一行一个,另一个train.txt
,里面名字的存储方式和task.txt
一样,我这里的目的是想要在vgg_feats.mat
里面抽取我想要的特征,其中涉及到元组的查找,这里记录一下。
元组查找我通过查资料找到两种方式:
第一种:
利用ismember
函数查看某个图片名是否是一个图片名元组集合的成员。
idx = ismember(cell_name, find_str)
返回的idx
是一个向量,1
表示找到的find_str
,0
表示不是。
第二种:
利用cellfun
函数,这个函数也是第一次接触,简单来说,就是定义一些在cell
上操作的函数。
[row, col] = find(cellfun(@(x) strcmp(x,find_str),cell_name);
上面的意思是在元组上定义了一组操作,操作的内容就是比较x
和find_str
是否相同,如果相同,就返回它所在的行和列,因为我这里图片的名字都是唯一的,所以返回的是单个数值,如果有重复的相同内容(比如在我这里就是图片的名字有重复),返回的就是一个向量,依次保存行和列。可以在matlab
命令行中通过doc cellfun
来查看更多关于该函数的功能。
下面附上自己的代码:
load('vgg_feats.mat')
trainpath = '../train.txt';
allpath = '../tasks.txt';
fid = fopen(allpath);
all_names = textscan(fid,'%s');
fclose(fid);
len_all = length(all_names{1});
fid = fopen(trainpath);
train_names = textscan(fid,'%s');
fclose(fid);
len_train = length(train_names{1});
dimension_feature = size(feats,1);
train_feats = zeros(dimension_feature, len_train);
for i= 1:len_train
fprintf('%s\n',train_names{1}{i});
[row, col] = find(cellfun(@(x) strcmp(x,char(train_names{1}{i})),all_names{1}));
%lia = ismember(all_names{1}, char(train_names{1}{i}));
%idx = find(row==1);
%train_feats(:,i) = feats(:,idx);
train_feats(:,i) = feats(:,row);
end
save('train_feats.mat','train_feats','-v7.3');