Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Eigh eigenvectors are inverted

Abierto
#368 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
rust
Área
data

Línea de trabajo

Start by running the MWE from main.rs with the dependencies in Cargo.toml and compare the results for UPLO::Lower and UPLO::Upper. Trace the eigh entry point and its LAPACK argument handling; done means A @ eigenvectors matches eigenvectors @ eigenvalues without reversing rows and the reported UPLO behavior is consistent.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Related: #307

MWE:

Cargo.toml:

[package]
name = "EighBug"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
# ndarray
ndarray = "0.15.6"
# ndarray_linalg
ndarray-linalg = { version = "0.16.0", features = ["openblas-static"] }
# num
num = "0.4.1"
# rustfmt
rustfmt = "0.10.0"

main.rs:

use ndarray::*;
use ndarray_linalg::*;
use num::complex::Complex64;

fn main() {
    let A = arr2(&[
        [
            Complex64::new(3., 0.),
            Complex64::new(2., 2.),
            Complex64::new(2., 2.),
        ],
        [
            Complex64::new(2., -2.),
            Complex64::new(3., 0.),
            Complex64::new(2., 2.),
        ],
        [
            Complex64::new(2., -2.),
            Complex64::new(2., -2.),
            Complex64::new(3., 0.),
        ],
    ]);

    println!("A = \n{}", A);

    let (eigenvalues, eigenvectors) = A.eigh(UPLO::Lower).unwrap();

    println!(
        "eigenvalues = \n{}",
        eigenvalues.mapv(|x| format!("{:.3}", x))
    );

    println!(
        "eigenvectors = \n{}",
        eigenvectors.mapv(|x| format!("{:.3}", x))
    );

    println!(
        "A @ eigenvectors = \n{}",
        A.dot(&eigenvectors).mapv(|x| format!("{:.3}", x))
    );

    println!(
        "eigenvectors @ eigenvalues = \n{}",
        eigenvectors
            .dot(&Array2::from_diag(
                &eigenvalues.mapv(|x| Complex64::from(x))
            ))
            .mapv(|x| format!("{:.3}", x))
    );

    println!("==============================");
    println!("WITH REVERSED ROWS");

    let eigenvectors = eigenvectors.slice(s![..;-1, ..]).to_owned();
    println!(
        "eigenvectors = \n{}",
        eigenvectors.mapv(|x| format!("{:.3}", x))
    );

    println!(
        "A @ eigenvectors = \n{}",
        A.dot(&eigenvectors).mapv(|x| format!("{:.3}", x))
    );

    println!(
        "eigenvectors @ eigenvalues = \n{}",
        eigenvectors
            .dot(&Array2::from_diag(
                &eigenvalues.mapv(|x| Complex64::from(x))
            ))
            .mapv(|x| format!("{:.3}", x))
    );
}

Output

A = 
[[3+0i, 2+2i, 2+2i],
 [2-2i, 3+0i, 2+2i],
 [2-2i, 2-2i, 3+0i]]
eigenvalues = 
[-1.000, 1.536, 8.464]
eigenvectors = 
[[-0.577+0.000i, -0.577+0.000i, -0.577+0.000i],
 [-0.000+0.577i, 0.500-0.289i, -0.500-0.289i],
 [0.577-0.000i, -0.289+0.500i, -0.289-0.500i]]
A @ eigenvectors = 
[[-1.732+2.309i, -1.732+0.845i, -1.732-3.155i],
 [0.000+4.041i, -1.232+0.711i, -2.232-1.289i],
 [1.732+2.309i, -1.598+1.077i, -3.598+0.077i]]
eigenvectors @ eigenvalues = 
[[0.577+0.000i, -0.887+0.000i, -4.887+0.000i],
 [0.000-0.577i, 0.768-0.443i, -4.232-2.443i],
 [-0.577+0.000i, -0.443+0.768i, -2.443-4.232i]]
==============================
WITH REVERSED ROWS
eigenvectors = 
[[0.577-0.000i, -0.289+0.500i, -0.289-0.500i],
 [-0.000+0.577i, 0.500-0.289i, -0.500-0.289i],
 [-0.577+0.000i, -0.577+0.000i, -0.577+0.000i]]
A @ eigenvectors = 
[[-0.577+0.000i, -0.443+0.768i, -2.443-4.232i],
 [0.000-0.577i, 0.768-0.443i, -4.232-2.443i],
 [0.577+0.000i, -0.887-0.000i, -4.887+0.000i]]
eigenvectors @ eigenvalues = 
[[-0.577+0.000i, -0.443+0.768i, -2.443-4.232i],
 [0.000-0.577i, 0.768-0.443i, -4.232-2.443i],
 [0.577+0.000i, -0.887+0.000i, -4.887+0.000i]]

Expected output

A @ eigenvectors should equal eigenvectors @ eigenvalues without needing to invert the row ordering.


This could very likely be a misunderstanding on my end. But it may be related to the reversal of UPLO::Upper and UPLO::Lower. For example, for the array:

A = [[3+0i, 2+2i, 2+2i],
     [   0, 3+0i, 2+2i],
     [   0,    0, 3+0i]]

eigh(UPLO::upper) returns [3, 3, 3] for the eigenvalues, which is the expected result for eigh(UPLO::lower).

Lenguaje dominante
Rust
Estrellas
452
Forks
95
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de rust-ndarray/ndarray-linalg

Todos los issues de rust-ndarray/ndarray-linalg

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.