8

一連の画像でハリスの角を見つけるコードのセクションがあります。92枚の画像に対してこれを行う必要がありますが、かなり遅いです。そのため、コードを並行して実行したいと思います。以下のコードには、変数「corners」に関連するエラーがあります

%% Harris corners
    max_pts = 900;
    corners = zeros(max_pts,2,size(images,3));
    parfor i = 1:size(images,3)
        I = images(:,:,i);
        [y x] = get_corners(I,max_pts);
        corners(1:length(y),:,i) = [y x];
    end

それは言う:

MATLABは、ループの反復をグループに分割し、MATLABワーカーに送信して並列に実行することにより、parfor関数でループを実行します。MATLABが繰り返し可能で信頼性の高い方法でこれを行うには、ループで使用されるすべての変数を分類できる必要があります。コードは、分類と互換性のない方法で示された変数を使用します。推奨処置指定された変数の使用法を修正してください。変数の分類およびparforループの反復に関するその他の制限の詳細については、ParallelComputingToolboxのドキュメントの「変数の分類」を参照してください。

これを修正する方法はありますか?

ありがとう!

4

2 に答える 2

8

@Chrisが述べたように、

corners(1:length(y),:,i) = [y x];

問題です。コーナーがスライス可能であることを確認する簡単な方法は、セル配列を使用することです

max_pts = 900;
cornerCell = cell(size(images,3),1);
parfor i = 1:size(images,3)
    I = images(:,:,i);
    [y x] = get_corners(I,max_pts);
    cornerCell{i} = [y x];
end

コーナーをセル配列にしたくない場合(i番目の画像のコーナーをプロットするには、を呼び出すことができますimshow(images(:,:,i),[]),hold on, plot(cornerCell{i}(:,1),cornerCell{i}(:,2),'o'))、ループ内でいつでも元の900 x 2xnImages配列に変換して戻すことができます。目立った時間はかかりません:

corners = zeros(max_pts,2,size(images,3));
for i=1:size(images,3)
   corners(1:size(cornerCell{i},1),:,i) = cornerCell{i};
end
于 2011-03-06T02:20:04.550 に答える
2

最初に:

  corners(1:length(y),:,i) = [y x];

それが問題のラインです。

ドキュメントを読みましたか?

http://www.mathworks.com/help/toolbox/distcomp/brdqtjj-1.html#bq_tcng-1

配列の形状—スライスされた変数に割り当てる場合、割り当ての右側は[]または''ではありません(これらの演算子は要素の削除を示します)。

配列の形状。スライスされた変数は、一定の形状を維持する必要があります。ここでどちらかの行に示されている変数Aはスライスされていません。

A(i、:) = []; A(end + 1)= i;

どちらの場合もAがスライスされない理由は、スライスされた配列の形状を変更すると、クライアントとワーカー間の通信を管理する仮定に違反するためです。

xとyが何であるかについてはよくわかりませんが、問題が何であるかが明確になっているはずです。スライスに[]を割り当てないように、これを書き直すことはできますか?

于 2011-03-06T01:15:15.747 に答える