Eigh eigenvectors are inverted
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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).
- Lingua principale
- Rust
- Stelle
- 452
- Fork
- 95
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di rust-ndarray/ndarray-linalg
-
Thin SVD Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 38/100
rust-ndarray/ndarray-linalg#414 ·
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
rust-ndarray/ndarray-linalg#413 · 1 commento ·
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
rust-ndarray/ndarray-linalg#404 ·
-
SIGSEGV on qr decomposition Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
rust-ndarray/ndarray-linalg#402 · 1 commento ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
rust-ndarray/ndarray-linalg#401 · 2 reazioni ·
Tutte le issue di rust-ndarray/ndarray-linalg
Issue simili
-
Replayed reasoning items send "content": null, which the Responses API schema does not permit Apertabug CLI custom-model
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
rust-bitcoin/rust-bitcoin#6930 · 1 commento ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
fulcrumgenomics/ferro-hgvs#2251 ·
-
A-allocators A-docs C-enhancement T-libs
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100