10 x 10
行列があるとします。私が次に行うことは、3 x 3
行列を持つ行列全体を反復することです(この行列をより簡単にすることを除いて)。この3 x 3
行列からは、この3 x 3
の平均/平均値が得られます。次に、元の行列の値を新しい平均値/平均値に置き換えることです。行列値を、MATLABのより小さい行列から抽出した平均値に置き換えます。
どうすればいいですか?いくつかのコード例は高く評価されます。
10 x 10
行列があるとします。私が次に行うことは、3 x 3
行列を持つ行列全体を反復することです(この行列をより簡単にすることを除いて)。この3 x 3
行列からは、この3 x 3
の平均/平均値が得られます。次に、元の行列の値を新しい平均値/平均値に置き換えることです。行列値を、MATLABのより小さい行列から抽出した平均値に置き換えます。
どうすればいいですか?いくつかのコード例は高く評価されます。
あなたがしようとしているのは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'
フラグは、戻ってくる行列が元の行列と同じサイズであることを意味します。これは重要です。なぜなら、あなた自身が理解したように、エッジを扱う方法は複数あるからです。
これを行うには、すべての手段が得られるまで元のままにしておく必要があります。つまり、ループを使用してこれを実装する場合、平均を別の行列に格納する必要があります。境界を取得するには、元の行列を新しい行列にコピーするのが最も簡単ですが、境界線のみをコピーする必要があります。次いで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);
タンク非常にあなた!コードの一部が私を助けてくれました。それはまさに私が探していたものでした。 – dtd