0

Matlab コード スニペットがあり、C++ で記述しようとしていますが、そこで何が起こっているのか本当にわかりません。

for c = 1:3
    Id = double(I(:,:,c))/255;
    Wc(:,:,c) = sum(Id(pixels).*weights, 3);
end

サイズ 480x640x3 の画像 I があります。最初の反復では、画像の最初のチャネルが Id に保存され、そのサイズは 480x640 になります。しかし、次の行で何が起こっているのでしょうか? 私はその構文を理解していません。

ピクセルとウェイトのサイズは 300x383x4x1 です。

では、この行は正確には何をしているのでしょうか?:

sum(Id(pixels).*weights, 3);

ありがとうございました。

4

1 に答える 1

1

sum(X, n)n次元X全体の行列のすべての要素を要約するため、次のようになります。

sum(Id(pixels) .* weights, 3);

実際には次のことを行います。

  • Id抽出された値のインデックスである行列から部分行列をpixels抽出します。
    行列Idは暗黙的に列ベクトルに変換され、結果の部分行列はと同じサイズになりますpixels(各値はに等しくId(p)、ここで、pはの対応する要素です。pixels)。
  • 抽出された行列をweights要素ごとに別の行列で乗算します(乗算演算子は.*)であることに注意してください。
  • 結果の3Dマトリックスのすべての要素を3次元に沿って要約します。

詳細については、公式ドキュメントを参照してください。

編集:簡単な例

それを仮定しましょう:

Id = [10 20; 30 40; 50 60; 70 80];
pixels(:, :, 1) = [4 4; 4 4];
pixels(:, :, 2) = [6 6; 6 6];
pixels(:, :, 3) = [8 8; 8 8];

つまり、Id2次元行列であり、pixels3次元です。さて、次のId(pixels)ようになります。

ans(:, :, 1) =

  70  70
  70  70

ans(:, :, 2) =

  40  40
  40  40

ans(:, :, 3) =

  80  80
  80  80

Id列ベクトルに変換すると(try Id(:))、70は4番目の要素、40は6番目80は8番目であるためです。結果の次元はpixelsId!ではなく)と同じであることに注意してください。

お役に立てば幸いです。

于 2012-10-24T17:01:27.737 に答える