2012-04-25 5 views
1

10 x 10行列があるとします。私が次に行うことは、3 x 3行列を持つ行列全体を反復することです(この行列をより簡単にすることを除いて)。この3 x 3行列からは、この3 x 3の平均/平均値が得られます。次に、元の行列の値を新しい平均値/平均値に置き換えることです。行列値を、MATLABのより小さい行列から抽出した平均値に置き換えます。

どうすればいいですか?いくつかのコード例は高く評価されます。

答えて

4

あなたがしようとしているのはconvolutionです。 MATLABでは、次のことができます(コンボリューションとMATLABでの処理の詳細を参照してください)。

conv2(myMatrix , ones(3)/9 , 'same'); 

少し解読しています。 myMatrixはあなたが作業しているマトリックスです(上記の10x10のものです)。 ones(3)/9コマンドを使用するとの3x3のエントリに値バイ値マスクのエントリを乗じ、このマスクを取り、それを周りに移動すると

 
1/9 1/9 1/9 
1/9 1/9 1/9 
1/9 1/9 1/9 

あるフィルタカーネル、いわゆるマスクを作成しますその結果(ドットプロダクト、本質的に)を加えると、このマスクの下にある9つの値の平均が得られます。ですから、このマスクを行列の3x3セグメント(イメージ、私は想像します)の上に置き、真ん中の値を平均で置き換えると、そのコマンドの結果が得られます。あなたはそれをさらに実験することを歓迎します。 'same'フラグは、戻ってくる行列が元の行列と同じサイズであることを意味します。これは重要です。なぜなら、あなた自身が理解したように、エッジを扱う方法は複数あるからです。

1

これを行うには、すべての手段が得られるまで元のままにしておく必要があります。つまり、ループを使用してこれを実装する場合、平均を別の行列に格納する必要があります。境界を取得するには、元の行列を新しい行列にコピーするのが最も簡単ですが、境界線のみをコピーする必要があります。次いでAveragedMatrix

このaverage3x3関数コピー入力Matrixとは、任意の境界上にないすべての要素を通過し、3×3の空間とAveragedMatrixの対応する要素に格納するの平均を算出します。

function [AveragedMatrix] = average3x3(Matrix) 

AveragedMatrix = Matrix; 

if ((size(Matrix, 1) < 3) || (size(Matrix, 2) < 3)) 
    fprintf('Matrix is too small, minimum matrix size is 3x3.\n'); 
    return 
end 

for RowIndex = 2:(size(Matrix, 1)-1) 
    Rows = RowIndex-1:RowIndex+1; 

    for ColIndex = 2:(size(Matrix, 2)-1) 
     Columns = ColIndex-1:ColIndex+1; 
     AveragedMatrix(RowIndex,ColIndex) = mean(mean(Matrix(Rows,Columns))); 
    end 
end 

return 

この機能を使用するには、あなたが試すことができます:

A = randi(10,10); 

AveragedA = average3x3(A); 
+0

タンク非常にあなた!コードの一部が私を助けてくれました。それはまさに私が探していたものでした。 – dtd