中央ポイントからマトリックスを外側に複製します
質問
私はプログラミングが非常に初めてなので、この演習を完了するときに私を正しい方向に微調整する専門家を探しています。
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}
から mymatrices
と largemat{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;
入力として、これはクラッシュしません...結果のマトリックスが正しいことを手動でチェックしていませんが;-)。
他のヒント
新しいレイヤーを使用して既存のマトリックスを拡張しようとする代わりに、特定のレイヤー数のすべてのマトリックスを生成する関数を作成する方がおそらく簡単です。