Shayan
April 15, 2024, 5:49pm
1
Consider the following matrix:
julia> c = rand(2, 2)
2×2 Matrix{Float64}:
0.0443768 0.515352
0.531426 0.967584
Expected output:
1-element Vector{Float64}:
0.531426
I can do:
julia> using LinearAlgebra: LowerTriangular
julia> LowerTriangular(c)
2×2 LowerTriangular{Float64, Matrix{Float64}}:
0.0443768 ⋅
0.531426 0.967584
Collecting the previous lower triangular includes the diagonal of the matrix too. I want to omit the diagonal. How to do it?
You can use the tril
function :
julia> c = rand(4,4)
4×4 Matrix{Float64}:
0.508891 0.659778 0.639252 0.569137
0.212345 0.834971 0.233612 0.564073
0.812287 0.760213 0.224285 0.466787
0.872574 0.516204 0.701075 0.359622
julia> LowerTriangular(tril(c, -1))
4×4 LowerTriangular{Float64, Matrix{Float64}}:
0.0 ⋅ ⋅ ⋅
0.212345 0.0 ⋅ ⋅
0.812287 0.760213 0.0 ⋅
0.872574 0.516204 0.701075 0.0
It’s not clear how useful the LowerTriangular
type is here, however, rather than simply tril(c, -1)
stored as a Matrix
. The main utility of the LowerTriangular
type is to support fast methods for solving Lx =b lower-triangular systems, but with a zero diagonal the problem is singular so those methods aren’t applicable.
(Another application of LowerTriangular
is to have an in-place lower-triangular view of a matrix where you are storing something else in the upper triangle, as sometimes happens with in-place matrix factorizations, but that’s not the case if you use tril
.)
1 Like
Shayan
April 15, 2024, 5:55pm
3
Isn’t tril(c, -1)
enough?
stevengj:
It’s not clear how useful the LowerTriangular
type is here, however, rather than simply tril(c, -1)
stored as a Matrix
. The main utility of the LowerTriangular
type is to support fast methods for solving Lx =bLx=bLx =b lower-triangular systems, but with a zero diagonal the problem is singular so those methods aren’t applicable.
Thank you so much!
Yes, depends on what matrix type you want to use. See also the comments at the bottom of my revised post (I was editing it while you responded).
1 Like
Dan
April 15, 2024, 6:07pm
5
If you wanted the vector of entries, maybe this will do:
julia> A = rand(3,3)
3×3 Matrix{Float64}:
0.212689 0.222497 0.34268
0.376084 0.004906 0.706805
0.395929 0.334694 0.883166
julia> [v for (k,v) in pairs(A) if k[1]>k[2]]
3-element Vector{Float64}:
0.37608410776838963
0.3959294893831178
0.33469399665884414
4 Likes