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) として機能するはずですが、クエリは qu​​eryFiles のコピーのように見えます。このベクトルを通常どおり反復するにはどうすればよいですか?


問題を解決することができました。それは主に私の MATLAB 無知によるものでした。私はセル配列を知らなかったので、この問題が発生しました。それと必要な転置。

4

4 に答える 4

1

あなたのコードから、それqueryFilesは数値ベクトルのようです。多分それはベクトルですか?その場合、それを行に変換する必要があります。

for query = queryFiles.'

これはfor、Matlab のループが反復ごとに列を選択するためです。ベクトルが単一の列の場合、1 回の繰り返しでベクトル全体が選択されます。

于 2013-11-07T14:58:55.953 に答える
1

MATLAB では、forコンストラクトは入力として行ベクトルを想定しています。

for ii = 1:5

動作します(ii = 1、2、...で5回ループ)

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 に答える