2

次元が 4x4 の行列 A があるとします。

ここで、この行列を係数 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 のダウンサンプリング用。

行列 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ループなしでこれを行うより速い方法はありますか?

4

2 に答える 2

3

これはどう:

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) のみに関心があります

于 2015-04-10T17:37:21.677 に答える