2016-04-14 16 views
2

この二重対角行列をジュリアで再現するにはどうすればよいですか?理解を使用しジュリアの二重対角行列を理解度付きで作成する

1 0 0 
-1 1 0 
    0 -1 1 
    0 0 -1 
+3

理解を使用する特別な理由はありますか? – DSM

+0

もし私がそれを知ってうれしくなるより良い方法があれば。私は二重対角関数を見つけましたが、この行列を関数または理解なしで暗くする方法は(100,100)です。 – nicolasdavid

答えて

9

が密な配列を作成し、それが非正方形になります

julia> M = 4; N = 3; 
     [i==j ? 1 : i==j+1 ? -1 : 0 for i = 1:M, j=1:N] 
4x3 Array{Int64,2}: 
    1 0 0 
-1 1 0 
    0 -1 1 
    0 0 -1 

それとも、正方行列のためBidiagonalを使用することができます。

julia> M = 4; 
     Bidiagonal(ones(Int, M), -ones(Int, M-1), false) # false means that it's not an upper-diagonal 
4x4 Bidiagonal{Int64}: 
    1 0 0 0 
-1 1 0 0 
    0 -1 1 0 
    0 0 -1 1 

後者ありより効率的になるような特殊な線形代数法があります。

+0

答えをいただきありがとうございます.Bidiagonal()は正方行列でしかないと言っていますか?だから、もし私が4x3の理解をしたいのであれば、理解することができるのですか? – nicolasdavid

+0

はい、正確です。 –

3

今はちょっと遅いと知っていますが、あなたが本当に大きくなる必要がある場合、私はより速い方法を持っています。あなたたとえば、私は、関数を書いた:

function Bi_diag(M,N,d1,d2) 
    A = zeros(M,N); 
    A[1:M+1:end] = d1; 
    A[2:M+1:end] = d2; 
    return A 
    end 

これは、はるかに速く、あなたの小さな例えば大きな行列を作るために必要がある場合は、上記の例よりもある:M = 4、N = 3、D1 = 1、D2 = -1となる。一般に、A [1:M + 1:end] = dを使用するのは、主対角線を埋めるための速い方法です。下の対角線を埋めるには、下の対角線の最初の要素(例2)から始まり、上の対角線を埋めるためにM + diagに行きます。ここでdiagは、あなたが書きたい上の対角の番号です。あなたの小さな例では、メイン対角線の上の最初の対角線を埋めるために、A [M + 1:M + 1:end] = d3となります。 また、私の関数を使用すると、すべて同じではない値を入れることができます(同じ数字の代わりにさまざまな数の対角線を塗りつぶします)。

関連する問題