/// <inheritdoc /> protected override DenseColumnMajorStorage <Complex> CreateEigenVectorsMatrix() { // Number of requested eigenvalues. int k = this.Count; // Matrix with k columns of complex eigenvectors. var result = new CSparse.Complex.DenseMatrix(size, k); var values = result.Values; // Raw eigenvector storage. var rp = (double[])eigvec; if (symmetric) { for (int i = 0; i < k; i++) { int column = i * size; for (int j = 0; j < size; j++) { values[column + j] = rp[column + j]; } } return(result); } for (int i = 0; i < k; i++) { int current = i * size; // Current column offset. for (int j = 0; j < size; j++) { values[current + j] = new Complex(rp[2 * (current + j)], rp[2 * (current + j) + 1]); } } return(result); }
/// <inheritdoc /> protected override Matrix <Complex> CreateEigenVectorsMatrix() { // Number of requested eigenvalues. int k = this.Count; // Matrix with k columns of complex eigenvectors. var result = new CSparse.Complex.DenseMatrix(size, k); var values = result.Values; // Raw eigenvector storage. var rp = (double[])eigvec; if (symmetric) { for (int i = 0; i < k; i++) { int column = i * size; for (int j = 0; j < size; j++) { values[column + j] = rp[column + j]; } } return(result); } // Imaginary part of eigenvalues. var eim = (double[])eigvali; int length = values.Length; for (int i = 0; i < k; i++) { int current = i * size; // Current column offset. if (eim[i] == 0.0) { for (int j = 0; j < size; j++) { values[current + j] = rp[current + j]; } } else { int next = (i + 1) * size; // Next column. for (int j = 0; j < size; j++) { var a = new Complex(rp[current + j], rp[next + j]); values[current + j] = a; // Check if next column is available (alternatively, allocate space for // one additional column, see CreateWorkspace() method below). if (next < length) { values[next + j] = Complex.Conjugate(a); } } i++; } } return(result); }