我有一个Matlab代码片段,我尝试用C ++编写,但我真的不明白 那里发生了什么:
for c = 1:3
Id = double(I(:,:,c))/255;
Wc(:,:,c) = sum(Id(pixels).*weights, 3);
end
有一张尺寸为480x640x3的图像。在第一次迭代中,图像的第一个通道是 保存在Id中,然后其大小为480x640。但下一行发生了什么?我只是没有 理解这种语法。
像素和重量的大小为300x383x4x1。
那么这条线究竟做了什么?:
sum(Id(pixels).*weights, 3);
谢谢。
答案 0 :(得分:1)
sum(X, n)
总结了 n -th维度中矩阵X
的所有元素,因此:
sum(Id(pixels) .* weights, 3);
确实做到以下几点:
Id
中提取子矩阵,pixels
是提取值的索引:Id
被明确转换为列向量,得到的子矩阵与pixels
的大小相同(每个值等于Id(p)
,其中p
为pixels
)中的相应元素。weights
逐个元素(请注意,乘法运算符为.*
)您可以查看the official documentation以获取更多信息。
我们假设:
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 矩阵,pixels
是 3-D 。现在,Id(pixels)
将产生:
ans(:, :, 1) =
70 70
70 70
ans(:, :, 2) =
40 40
40 40
ans(:, :, 3) =
80 80
80 80
因为如果您将Id
转换为列向量(尝试Id(:)
),则70
是4 th 元素,40
是6 th ,80
是8 th 。请注意,结果与pixels
(不是Id
!)的尺寸相同。
希望有所帮助!