2

我有以下代码:

for query = queryFiles
    queryImage = imread(strcat('Queries/', query));
    queryImage = im2single(rgb2gray(queryImage));
    [qf,qd] = vl_covdet(queryImage, opts{:}) ;
    for databaseEntry = databaseFiles
        entryImage = imread(databaseEntry.name);
        entryImage = im2single(rgb2gray(entryImage)); 
        [df,dd] = vl_covdet(entryImage, opts{:}) ;
        [matches, H] = matchFeatures(qf,qf,df,dd) ;
        result = [result; query, databaseEntry, length(matches)];
    end
end

据我了解,它应该作为 Java/C++ for(query:queryFiles) 工作,但是查询似乎是 queryFiles 的副本。我如何正常迭代这个向量?


我设法解决了这个问题。这主要是因为我对 MATLAB 的无知。我不知道单元阵列,这就是我遇到这个问题的原因。那和所需的换位。

4

4 回答 4

1

From your code it appears that queryFiles is a numeric vector. Maybe it's a column vector? In that case you should convert it into a row:

for query = queryFiles.'

This is because the for loop in Matlab picks a column at each iteration. If your vector is a single column, it picks the whole vector in just one iteration.

于 2013-11-07T14:58:55.953 回答
1

在 MATLAB 中,该for构造需要一个行向量作为输入:

for ii = 1:5

将工作(循环 5 次, ii = 1, 2, ...)

x = 1:5;
for ii = x

以同样的方式工作

但是,当您拥有除行向量之外的其他内容时,您只需获取一份副本(或一次获取一列数据)。

为了更好地帮助您,您需要告诉我们数据类型queryFiles是什么。我猜它可能是一个字符串单元数组,因为您正在与文件路径连接(查看fullfile函数以了解执行此操作的“正确”方法)。如果是这样,那么“安全”的方法是:

for ii = 1:numel(queryFiles)
  query = queryFiles{ii}; % or queryFiles(ii)

了解您所在的循环编号通常会有所帮助,并且在这种情况下ii会为您提供该计数。即使您不提前知道形状queryFiles是什么,这种方法也很强大。

于 2013-11-07T14:56:11.787 回答
0

以下是如何遍历 中的所有元素queryFiles,这适用于标量、行向量、列向量甚至高维矩阵:

for query = queryFiles(:)'
   % Do stuff
end
于 2013-11-07T16:52:58.440 回答
0

queryFiles元胞数组吗?最安全的方法是使用索引:

for i = 1:numel(queryFiles)
    query = queryFiles{i};
    ...
end
于 2013-11-08T15:30:45.430 回答