假设我有一个矩阵 A,其尺寸为 4x4。
现在我想将该矩阵下采样 2 倍以获得维度为 2x2 的新矩阵 B。
我想通过以下方式进行下采样:
设A为
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
我希望B成为
3.5000 11.5000
5.5000 13.5000
要得到 B(1,1) = 我取平均值 (1, 5, 2 和 6)
要得到 B(1,2) = 我取平均值 (9, 13, 10 和 14)
为了得到 B(2,1) = 我取平均值 (3, 7, 4 和 8) 等等。
因此,对于 B 中的每个元素,我从 A 中取出相应的 2x2 block 并取其平均值。
就我而言,矩阵 A 的维度很大。 此外,下采样因子可以是任意的。
例如, 一个=
1 7 13 19 25 31
2 8 14 20 26 32
3 9 15 21 27 33
4 10 16 22 28 34
5 11 17 23 29 35
6 12 18 24 30 36
用于大小 3/2 的下采样。</p>
矩阵 B 的大小为 4x4。
对于每个 B 单元,我必须采用不重叠的 1.5x1.5 block A。
例如,
B(1,1) = 平均值(1, 0.5x7, 0.5x2, 0.5x8)
B(2,1) = 平均值(0.5x2, 0.5x8, 3, 9)
B(3,1) = 平均值(4, 0.5x10, 0.5x5, 0.5x11)
B(4,1) = 平均值(0.5x5, 0.5x11, 6, 12)
等等。
有没有一种更快的方法可以在不使用 for 循环的情况下完成此操作?
最佳答案
这个怎么样:
A = [1 5 9 13;
2 6 10 14;
3 7 11 15;
4 8 12 16];
B = ones(2)/4;
out = conv2(A,B,'valid');
%{
out = [3.5000 7.5000 11.5000;
4.5000 8.5000 12.5000;
5.5000 9.5000 13.5000];
%}
这为您提供了比您要求的多一点的信息,但您可以丢弃不需要的信息。对于本例,您只对 out(1,1) 、 out(1,3) out (3,1) 和 out(3,3) 感兴趣
关于matlab - 在 matlab 中通过平均分块对二维矩阵进行下采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29567130/