我有以下代码:
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 ++用于(query:queryFiles),但查询似乎是queryFiles的副本。如何正常迭代此向量?
我设法解决了问题。这主要是因为我的MATLAB无知。我不知道细胞阵列,这就是我遇到这个问题的原因。这和所需的换位。
答案 0 :(得分:1)
从您的代码中可以看出queryFiles
是一个数字向量。也许它是列向量?在这种情况下,您应该将其转换为一行:
for query = queryFiles.'
这是因为Matlab中的for
循环在每次迭代时选择一列。如果您的向量是单个列,它只需一次迭代就可以选择整个向量。
答案 1 :(得分:0)
在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
的形状是什么,这种方法也很稳健。
答案 2 :(得分:0)
以下是如何循环遍历queryFiles
中的所有元素,这适用于标量,行向量,列向量甚至高维矩阵:
for query = queryFiles(:)'
% Do stuff
end
答案 3 :(得分:0)
queryFiles
是一个单元格数组吗?最安全的方法是使用索引:
for i = 1:numel(queryFiles)
query = queryFiles{i};
...
end