朱莉娅的下三角矩阵

vin*_*cet 4 matrix diagonal julia

我的列数等于行数.并且对角线等于零.我该如何构建这个矩阵?

#mat
#     [,1] [,2] [,3] [,4]
#[1,]   0   NA   NA   NA
#[2,]    1   0   NA   NA
#[3,]    2    4   0   NA
#[4,]    3    5    6   0
Run Code Online (Sandbox Code Playgroud)

我试过这个

x=rand(4,4)
4x4 Array{Float64,2}:
 0.60064   0.917443  0.561744   0.135717 
 0.106728  0.72391   0.0894174  0.0656103
 0.410262  0.953857  0.844697   0.0375045
 0.476771  0.778106  0.469514   0.398846 

c=LowerTriangular(x)

4x4 LowerTriangular{Float64,Array{Float64,2}}:
 0.60064   0.0       0.0       0.0     
 0.106728  0.72391   0.0       0.0     
 0.410262  0.953857  0.844697  0.0     
 0.476771  0.778106  0.469514  0.398846
Run Code Online (Sandbox Code Playgroud)

但我正在寻找这样的东西

c=LowerTriangular(x)
4x4 LowerTriangular{Float64,Array{Float64,2}}:
 0.0   NA      NA       NA    
 0.106728  0.0    NA      NA    
 0.410262  0.953857  0.0 NA     
 0.476771  0.778106  0.469514  0
Run Code Online (Sandbox Code Playgroud)

对角线应该等于零.

Ale*_*ley 5

您可能希望使用列表推导.但如果你能在关于你想要做什么的问题上提供更多信息,那将是一件好事.

numrows =4
numcols = 4
[ x>y ? 1 : (x == y ? 0 : NaN) for x in 1:numrows, y in 1:numcols]
Run Code Online (Sandbox Code Playgroud)

这会给:

 0  NaN  NaN  NaN
 1    0  NaN  NaN
 1    1    0  NaN
 1    1    1    0
Run Code Online (Sandbox Code Playgroud)

对于任意数量的行和列.然后你可以从那里工作.

有关列表推导和条件,请参阅文档:

http://docs.julialang.org/en/release-0.4/manual/arrays/#comprehensions

http://docs.julialang.org/en/release-0.4/manual/control-flow/#man-conditional-evaluation


Mic*_*gge 4

以下内容的灵感来自于 Julia 用户列表中 Stefan Karpinski 的代码:

function vec2ltri_alt{T}(v::AbstractVector{T}, z::T=zero(T))
    n = length(v)
    v1 = vcat(0,v)
    s = round(Int,(sqrt(8n+1)-1)/2)
    s*(s+1)/2 == n || error("vec2utri: length of vector is not triangular")
    s+=1
    [ i>j ? v1[round(Int, j*(j-1)/2+i)] : (i == j ? z : NaN) for i=1:s, j=1:s ]
end

julia> vec2ltri_alt(collect(1:6))
4x4 Array{Any,2}:
 0  NaN  NaN  NaN
 1    0  NaN  NaN
 2    3    0  NaN
 3    4    6    0
Run Code Online (Sandbox Code Playgroud)

注意:如果需要,请查看有关三元运算符的官方文档,以更清楚地了解? ... :此处语法的情况。

对于那些寻找更“标准”对角矩阵解决方案的人:

这是创建更标准解决方案的版本:

function vec2ltri{T}(v::AbstractVector{T}, z::T=zero(T))
    n = length(v)
    s = round(Int,(sqrt(8n+1)-1)/2)
    s*(s+1)/2 == n || error("vec2utri: length of vector is not triangular")
    [ i>=j ? v[round(Int, j*(j-1)/2+i)] : z for i=1:s, j=1:s ]
end

a = vec2ltri(collect(1:6))

julia> a = vec2ltri(collect(1:6))
3x3 Array{Int64,2}:
 1  0  0
 2  3  0
 3  4  6

julia> istril(a)  ## verify matrix is lower triangular
true
Run Code Online (Sandbox Code Playgroud)

如果您想要上三角:而不是下三角,只需将 更改i<=ji>=j

其他随机工具 注意还有类似的函数tril!(a),它将给定矩阵转换为下三角矩阵,用零替换主对角线上方的所有内容。有关此函数以及各种其他相关工具的更多信息,请参阅 Julia文档。