如何通过理解在朱莉娅中重新创建这个双对角矩阵?
1 0 0
-1 1 0
0 -1 1
0 0 -1
答案 0 :(得分:8)
使用理解创建一个密集的数组,它可以是非方形的:
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
后者有一些专门的线性代数方法,可以提高效率。
答案 1 :(得分: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:结束] = d3。 使用我的函数也可以放入不完全相同的值(用不同的数字填充对角线而不是所有相同的数字)。