2

私はプログラミングにまったく慣れていないので、この演習を完了するときに正しい方向に私を動かすための専門家を探しています。

私はこれを手動で行うためにhorzcatとvertcatを使用しましたが、誰かがもっと簡単な方法を知っているかどうか尋ねています。

マトリックス1は18x18で、1から水平方向にインデックスが付けられます。

マトリックス1は中央にあり、離散空間を表しています。マトリックス2、3、4、5、6、7、8、9は、マトリックス1の複製であり、離散空間も表し、右、右下、下、左下、左、左上、上、右上に配置されています。

マトリックス10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25もマトリックス1の複製であり、マトリックス2から9を囲んでいます。以下のようなパターン。各行列はそれ自体が個別の単位です。

必要な行列の数を定義する場合、この場合は「49」または「行列1から4ステップ」としましょう(人は対角線上で1、9、25、49からジャンプするか、1、8、23、 46直線上)、このパターンで行列を作成するにはどうすればよいですか?

                      43  44  45  46 47  48 49
                      42  21  22  23 24  25 26
                      41  20  7   8   9  10 27
                      40  19  6   1   2  11 28
                      39  18  5   4   3  12 29
                      38  17  16  15  14 13 30
                      37  36  35  34  33 32 31     

これを図式的に示すと、問題をより適切に表現できると思います。

したがって、最初のリングは次のとおりです。

                               7 8 9
                               6 1 2
                               5 4 3

2番目のリングはこれです:

                       21  22  23  24  25
                       20  7   8   9   10
                       19  6   1   2   11
                       18  5   4   3   12
                       17  16  15  14  13

3番目のリングは

                  43  44  45  46  47  48  49
                  42  21  22  23  24  25  26
                  41  20   7   8   9  10  27
                  40  19   6   1   2  11  28
                  39  18   5   4   3  12  29
                  38  17  16  15  14  13  30
                  37  36  35  34  33  32  31

等々。このパターンを無限に続けていきたいと思います。

Matlabでこれを行うための最良の方法は何ですか?

明確になっていないことをお詫びし、問題をより適切に表現する必要があります。あなたのコメントはすべて、適切な問題を書く方法を私に示すのに非常に役立ちます。

助けてくれてありがとう。ここでのサポートは並外れたものであるため、このフォーラムに参加したばかりです。

4

2 に答える 2

2

すべてのマトリックスが最初のマトリックスの真のコピー(「複製」)である場合(それを呼び出しますmat18)、nth ステップで単に呼び出すことができます

largemat=repmat(mat18, 2*n+1, 2*n+1);

例えば

largemat=repmat(mat18, 7,7);

例で説明したマトリックスを生成します。Clement が言うように、これは既存のマトリックスを拡張するのではなく、大きなマトリックスを直接作成します。

更新 2

行列が異なる場合、たとえば、セル配列 mymatrices{1}に49 個の行列が格納されている場合は、次のように開始しますmymatrices{2}mymatrices{49}

largemat{1}=mymatrices{1};

largemat{n+1}から次の を計算するには、 の「周囲」に次の mymatrix を追加する必要があります。の最初の行列が既に含まれているため、それらが必要になり、正しく配置されます。mymatriceslargemat{n}largemat{n}largemat{n}m^2m=2*n+1mymatrices{(m^2+1):((m+2)^2)}

そして、各ステップでそれを拡大します

largemat{n+1} = [ largemat{n} cell2mat(mymatrices(m^2+(1:m))')]; %# add to the right
largemat{n+1} = [ largemat{n+1} ; cell2mat(mymatrices(m^2+m+(m+1:-1:1)))]; %# add at bottom
largemat{n+1} = [ cell2mat(mymatrices(m^2+2*m+1+(m+1:-1:1))') largemat{n+1}]; %# add at right
largemat{n+1} = [ cell2mat(mymatrices(m^2+3*m+2+(1:m+2))) ; largemat{n+1}]; %# add at top

このコードをテストするには、部分行列に単純な数値を使用します。

mymatrices=mat2cell(1:49,1,ones(1,49));

これで、上記のコードをループで実行し、中間結果を出力して確認できます。

largemat{1}=mymatrices{1};
for n=1:3
    m=2*n-1;
    largemat{n+1} = [ largemat{n} cell2mat(mymatrices(m^2+(1:m))')]; %# add to the right
    largemat{n+1} = [ largemat{n+1} ; cell2mat(mymatrices(m^2+m+(m+1:-1:1)))]; %# add at bottom
    largemat{n+1} = [ cell2mat(mymatrices(m^2+2*m+1+(m+1:-1:1))') largemat{n+1}]; %# add at right
    largemat{n+1} = [ cell2mat(mymatrices(m^2+3*m+2+(1:m+2))) ; largemat{n+1}]; %# add at top
    largemat{n+1}
end

印刷する

ans =
     7     8     9
     6     1     2
     5     4     3
ans =
    21    22    23    24    25
    20     7     8     9    10
    19     6     1     2    11
    18     5     4     3    12
    17    16    15    14    13
ans =
    43    44    45    46    47    48    49
    42    21    22    23    24    25    26
    41    20     7     8     9    10    27
    40    19     6     1     2    11    28
    39    18     5     4     3    12    29
    38    17    16    15    14    13    30
    37    36    35    34    33    32    31

非スカラー入力行列でも機能することをテストするには、次を使用します

mymatrices=cell(1,49);
for i=1:49,mymatrices{i}=rand(9,9),end;

入力として、これはクラッシュしません...結果の行列が正しいことを手動で確認していませんが;-)。

于 2011-10-20T13:12:25.287 に答える
1

新しいレイヤーで既存のマトリックスを拡張しようとする代わりに、指定された数のレイヤーに対してすべてのマトリックスを生成する関数を作成する方がおそらく簡単です。

于 2011-10-20T13:08:56.693 に答える