質問

私はプログラミングが非常に初めてなので、この演習を完了するときに私を正しい方向に微調整する専門家を探しています。

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、22、23、24、24、24、25は、マトリックス1とサラウンドマトリックス2から9の複製です。以下のパターン。各マトリックス自体は個別のユニットです。

必要なマトリックスの数を定義する場合、この場合、「49」または「Matrix 1から4ステップ」としましょう(人は対角線で1、9、25、49からジャンプできます。 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でこれを行うための最良の方法は何ですか?

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

あなたの助けに感謝します。ここでのサポートは例外的であるため、このフォーラムに参加しました。

役に立ちましたか?

解決

すべてのマトリックスが最初のマトリック(「複製」)の場合(「複製」) mat18)、 あなたのための nあなたはただ電話することができるステップ

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

例えば

largemat=repmat(mat18, 7,7);

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

更新2

マトリックスが異なる場合, 、たとえば、49のマトリックスが保存されています セルアレイ mymatrices{1}, mymatrices{2}, ... mymatrices{49}, 、あなたは最初から始まります

largemat{1}=mymatrices{1};

次に計算します largemat{n+1} から mymatriceslargemat{n}, 、次のmymatricesを「周り」に追加する必要があります largemat{n}. largemat{n} すでに最初のものが含まれています m^2 とのマトリックス m=2*n+1, 、だからあなたが必要になるでしょう mymatrices{(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

テストするには、nonscalar入力マトリックスでも機能します。

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

入力として、これはクラッシュしません...結果のマトリックスが正しいことを手動でチェックしていませんが;-)。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top