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)总结矩阵的所有元素X在第n维,所以这是:

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

确实做了以下事情:

  • 从矩阵 中提取一个子矩阵Idpixels作为提取值的索引:
    矩阵Id被隐式转换为列向量,并且生成的子矩阵的大小与pixels(每个值等于Id(p),其中ppixels)。
  • 将提取的矩阵与另一个矩阵weights逐个元素相乘(请注意,乘法运算符为.*
  • 沿第三维汇总生成的 3-D 矩阵的所有元素。

您可以查看官方文档以获取更多信息。

编辑:一个简单的例子

让我们假设:

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];

Id是一个2-D矩阵,并且pixels3-D。现在,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第 680第 8pixels请注意,结果与(不是Id!)具有相同的尺寸。

希望有帮助!

于 2012-10-24T17:01:27.737 回答