2017-02-21 8 views
1

私は奇数であるユーザー入力(i)を持っています。私は配列iを作成したいと思います。だから私は次のようにします:対角に反射された配列

ここでは、主対角線に沿って反射する数字を含む配列を生成したいと思います。私はこの使用してループを行うことができます

6 4 3 2 1 
1 6 3 2 1 
1 2 6 2 1 
1 2 3 6 1 
1 2 3 4 6 

をどのようにこれは単なる配列つくを使用して可能である:

I = 5なら、それは次のようになりますか?

+0

機能 'diag'と' triu'かもしれません便利である。 – nibot

+0

@nibotこれら2つの機能で十分か、他に何か必要がありますか? – carlosremove

+0

その行列の背後にある論理は何ですか?私はそれが「5x5」であることを別にすれば、その行列のどこにどの要素を配置するかをどのように決定するのでしょうか? –

答えて

2

最初に、各行が1からiの行になるように、iの行を作成し、対角を含む行列の上三角を0に設定します。この行列を180度回転させて別の行列を作成しますマトリックスとみんなに設定されているゼロの対角線に沿っすべてi + 1と追加の行列と同じサイズで、行列のすべてを一緒に追加行列:

i = 5; 
M = repmat(1 : i, i, 1); 
M(triu(M) ~= 0) = 0; 
O = M + (i + 1)*eye(i) + rot90(M, 2); 

のは、コード1の各ラインを通って行こう一度に。最初の行は、あなたが持っているサイズマトリックスを定義します。これはi x iです。次に、行列Mを作成し、1からiまでi行を作成します。repmatを使用すると、最初にベクトルを1からiにし、それを垂直にi倍に複製することができます。次に、triu関数を使用して、対角を含むこの行列の上三角部分を抽出しますが、上三角部分のすべての要素を0に設定します。上三角部分とゼロ以外の部分を単純に比較しますこれを行うためにlogicalインデックスを使用してください。これにより、対角部分と上三角部分が0に設定され、残りの部分はそのまま残ります。最後に

、我々はこの行列を取り、i + 1によってスケーリングeyeと単位行列でこれを追加し、最終的には上半分を完了するために、我々は単純に90度行列を回転させるrot90を使用して180度で、これと同じ行列を回転させるが、私たちは、180度の回転をしたいと、私たちは二度90度回転する必要があるので、2

に二parmeter rot90を設定する私たちは、このように取得する:

>> O 

O = 

    6  4  3  2  1 
    1  6  3  2  1 
    1  2  6  2  1 
    1  2  3  6  1 
    1  2  3  4  6