在Julia中创建具有理解力的双对角矩阵

时间:2016-04-14 17:22:11

标签: julia

如何通过理解在朱莉娅中重新创建这个双对角矩阵?

  1   0   0
 -1   1   0
  0  -1   1
  0   0  -1

2 个答案:

答案 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。 使用我的函数也可以放入不完全相同的值(用不同的数字填充对角线而不是所有相同的数字)。