Eigenvalues of symmetric matrix in packed format (upper triangular entries stacked in vector)



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. spev.
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 eigen! or 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]

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


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 LAPACK.syevr!.