I am trying to compute the eigenvalues of a symmetric matrix in packed format, i.e. you stack the upper triangular entries in a vector (http://www.netlib.org/lapack/lug/node123.html )
It seems like there exists a LAPACK function for that, e.g.
However, it seems like that function is not yet supported in Julia’s LAPACK package.
Another way would be to recreate the original matrix and then call
LAPACK.syevr!, like so:
using LinearAlgebra # represent the matrix [1 2 4; 2 3 5; 4 5 6] in packed form x_packed = [1;2;3;4;5;6] function populate_upper_triangle!(A::AbstractMatrix, x::AbstractVector) k = 0 for j in 1:size(A,1) for i in 1:j k += 1 A[i,j] = x[k] end end nothing end function packed_eigen(x) # compute original matrix size n = Int(sqrt(0.25 + 2 * length(x)) - 0.5) # allocate memory for orignal matrix X = zeros(n, n) populate_upper_triangle!(X, x) # solve eigenvalue problem (W, Z) = LAPACK.syevr!('V', 'A', 'U', X, 0.0, 0.0, 0, 0, -1.0); return W end packed_eigen(x_packed)
My question is, what is the most efficient way to do this without allocating a lot of memory (I want to compute the eigenvalues hundreds of times)? I want to avoid
X = zeros(n, n) populate_upper_triangle!(X, x)
and was envisioning something like
reshape to create a view-based upper triangular matrix that can be passed to