假设我有一个矩阵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块并取其平均值。
在我的情况下,矩阵A的尺寸很大。 此外,下采样因子可以是任意的。
例如, 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>
Matrix B的大小为4x4。
对于每个B单位,我必须采用非重叠的1.5x1.5块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循环,有没有更快的方法呢?
答案 0 :(得分:2)
这个怎么样:
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)感兴趣
答案 1 :(得分:1)
如果您有图像处理工具箱,则可以使用blockproc:
fun = @(block_struct) mean2(block_struct.data) * ones(size(block_struct.data));
B = blockproc(A,[2 2],fun);
B = reshape(unique(B),2,[])
输出:
A =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
B =
3.5 11.5
5.5 13.5
您可以根据需要更换块大小。请注意,对于非整数因子,MATLAB将截断它们。