0

私は配列を持っています:

 1 1 1 0 0 
 1 2 2 0 0
 1 2 3 0 0
 0 0 0 0 0
 0 0 0 0 0

作りたい

 1 1 1 1 1 
 1 2 2 2 1
 1 2 3 2 1
 1 2 2 2 1
 1 1 1 1 1

パイの 1/4 部分を 270 度回転させて、パイの残りの部分を埋めて完全な円を作るようなものです。基本的に、コーナー全体をすべての方向にミラーリングします。可能であれば、組み込みの matlab 機能を使用したくありません。可能であれば、いくつかのベクトル トリックのみを使用します。ありがとう。

編集:

これは、任意のサイズのゼロの行列に埋め込まれます。上記の例の両方で機能し、次の例を言います。

 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 1 1 1 0 0 0 0 0 0 0 0 0 
 0 0 1 2 2 0 0 0 0 0 0 0 0 0 
 0 0 1 2 3 0 0 0 0 0 0 0 0 0 
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

理想的には、[1,2,3.. N] というベクトルが必要です。これは、グリッド内のある点 xc,yc を中心とした配列 (N) の最高値を中心に循環的に回転できます。または、これが不可能な場合は、基本配列 [1 1 1, 1 2 2, 1 2 3] を取り、3 が中心になるように回転させ、上記の 2 番目の行列のように円を塗りつぶします。

編集:

rot90(M,k) は行列 M k 回回転することがわかりましたが、これは次のようになります。

Mrot = M + rot90(M,1) + rot90(M,2) + rot90(M,3)

Mrot =
 1  1  2  1  1
 1  2  4  2  1
 2  4  12 4  2
 1  2  4  2  1
 1  1  2  1  1

これは、正しくない x、y 方向にスタックします。

4

1 に答える 1

1

複製するコーナーが対角線に対して対称であると仮定すると(例のように)、1つのインデックス作成ステップでこれを行うことができます。Mサンプルの5行5列の行列を含む行列がある場合、その方法は次のとおりです。

>> index = [1 2 3 2 1];
>> M = M(index, index)

M =

     1     1     1     1     1
     1     2     2     2     1
     1     2     3     2     1
     1     2     2     2     1
     1     1     1     1     1
于 2013-02-01T20:43:08.403 に答える