1. 程式人生 > >matlab cell find 元組 查詢

matlab cell find 元組 查詢

首先宣告任務:資料按照圖片名稱分為訓練和測試,但是提取特徵的時候是按照全部的圖片提取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);

上面的意思是在元組上定義了一組操作,操作的內容就是比較xfind_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');