matlab - 在 matlab 中通过平均分块对二维矩阵进行下采样

标签 matlab matrix downsampling

假设我有一个矩阵 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/

相关文章:

image - 什么是对文本进行下采样的最佳过滤器?

matlab - 向量化 IF 语句

algorithm - 用于矩阵乘法的施特拉森算法

r - 如何通过另一个矩阵的值过滤矩阵

python - Numpy 高效大矩阵乘法

python - 如何有效地将点云数据的大型 numpy 数组转换为下采样的二维数组?

arrays - 通过抽取或提取 Swift 中的每个第 n 个元素进行下采样收集的有效方法

user-interface - 交互式操作Matlab图形上的矩形

matlab - 在 Matlab 中创建更复杂的数据结构?

matlab - 如何使用二进制掩码提取感兴趣区域