julia 中的下三角矩阵
Lower triangular matrix in 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
我试过了
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
但我正在寻找这样的东西
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
对角线应为零。
您可能想要使用列表理解。但如果你能在问题中提供更多关于你正在尝试做什么的信息,那就太好了。
numrows =4
numcols = 4
[ x>y ? 1 : (x == y ? 0 : NaN) for x in 1:numrows, y in 1:numcols]
这将给出:
0 NaN NaN NaN
1 0 NaN NaN
1 1 0 NaN
1 1 1 0
对于任意数量的行和列。然后你就可以在那里工作了。
查看列表理解和条件的文档:
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
这是从 Julia 用户 list:
上 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
注意:如果需要,请查看三元运算符上的 official documentation,以更清楚地了解此处的 ? ... :
语法。
对于那些寻找更多 "standard" 对角矩阵解决方案的人:
这是创建更标准解决方案的版本:
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
如果您想要上三角: 而不是下三角,只需将 i<=j
更改为 i>=j
。
其他随机工具 还请注意像 tril!(a)
这样的函数,它将原地转换给定矩阵为下三角矩阵,将主对角线上方的所有内容替换为零。有关此功能以及其他各种相关工具的更多信息,请参阅 Julia documentation。
接受的解决方案没有按顺序索引向量的所有元素,并且输出矩阵具有重复元素。公式错了。
这是我的建议,灵感来自以前的答案:
对于下三角矩阵:
function vec2ltri{T}(v::Vector{T})
d = length(v)
n = Int((sqrt(8d+1)+1)/2)
n*(n-1)/2 == d || error("vec2ltri: length of vector is not triangular")
[ i>j ? v[Int((2n-j)*(j-1)/2)+i-j] : 0 for i=1:n, j=1:n ]
end
这将输出:
julia> vec2ltri(collect(1:6))
4×4 Array{Int64,2}:
0 0 0 0
1 0 0 0
2 4 0 0
3 5 6 0
对于上三角矩阵:
function vec2utri{T}(v::Vector{T})
d = length(v)
n = Int((sqrt(8d+1)+1)/2)
n*(n-1)/2 == d || error("vec2utri: length of vector is not triangular")
[ i<j ? v[Int((j-1)*(j-2)/2)+i] : 0 for i=1:n, j=1:n ]
end
这将输出:
julia> vec2utri(collect(1:6))
4×4 Array{Int64,2}:
0 1 2 4
0 0 3 5
0 0 0 6
0 0 0 0
我的列数等于行数。并且对角线等于零。我怎样才能建立这个矩阵?
#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
我试过了
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
但我正在寻找这样的东西
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
对角线应为零。
您可能想要使用列表理解。但如果你能在问题中提供更多关于你正在尝试做什么的信息,那就太好了。
numrows =4
numcols = 4
[ x>y ? 1 : (x == y ? 0 : NaN) for x in 1:numrows, y in 1:numcols]
这将给出:
0 NaN NaN NaN
1 0 NaN NaN
1 1 0 NaN
1 1 1 0
对于任意数量的行和列。然后你就可以在那里工作了。
查看列表理解和条件的文档:
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
这是从 Julia 用户 list:
上 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
注意:如果需要,请查看三元运算符上的 official documentation,以更清楚地了解此处的 ? ... :
语法。
对于那些寻找更多 "standard" 对角矩阵解决方案的人:
这是创建更标准解决方案的版本:
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
如果您想要上三角: 而不是下三角,只需将 i<=j
更改为 i>=j
。
其他随机工具 还请注意像 tril!(a)
这样的函数,它将原地转换给定矩阵为下三角矩阵,将主对角线上方的所有内容替换为零。有关此功能以及其他各种相关工具的更多信息,请参阅 Julia documentation。
接受的解决方案没有按顺序索引向量的所有元素,并且输出矩阵具有重复元素。公式错了。 这是我的建议,灵感来自以前的答案:
对于下三角矩阵:
function vec2ltri{T}(v::Vector{T})
d = length(v)
n = Int((sqrt(8d+1)+1)/2)
n*(n-1)/2 == d || error("vec2ltri: length of vector is not triangular")
[ i>j ? v[Int((2n-j)*(j-1)/2)+i-j] : 0 for i=1:n, j=1:n ]
end
这将输出:
julia> vec2ltri(collect(1:6))
4×4 Array{Int64,2}:
0 0 0 0
1 0 0 0
2 4 0 0
3 5 6 0
对于上三角矩阵:
function vec2utri{T}(v::Vector{T})
d = length(v)
n = Int((sqrt(8d+1)+1)/2)
n*(n-1)/2 == d || error("vec2utri: length of vector is not triangular")
[ i<j ? v[Int((j-1)*(j-2)/2)+i] : 0 for i=1:n, j=1:n ]
end
这将输出:
julia> vec2utri(collect(1:6))
4×4 Array{Int64,2}:
0 1 2 4
0 0 3 5
0 0 0 6
0 0 0 0