2016-04-14 63 views
2

如何在理解中重新創建朱莉亞中的雙對角矩陣?在理解中創建Julia中的雙對角矩陣

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。 也使用我的函數留下的可能性,把不完全相同的值(用各種數字填充對角線,而不是所有相同的數字)。