import mir.ndslice;
import mir.math;
auto data =
[[ 0, 1],
[-1, 0]].fuse.as!double.rcslice;
auto eigenvalues = [0 + 1i, 0 - 1i].sliced;
auto eigenvectors =
[[0 - 1i, 1 + 0i],
[0 + 1i, 1 + 0i]].fuse;
auto res = data.eigen;
assert(res.eigenvalues.equal!approxEqual(eigenvalues));
foreach (i; 0 .. eigenvectors.length)
assert((res.eigenvectors.lightScope[i] / eigenvectors[i]).diff.slice.nrm2.approxEqual(0));
import mir.ndslice;
import mir.math;
import mir.blas;
auto data =
[[0, 1, 0],
[0, 0, 1],
[1, 0, 0]].fuse.as!double.rcslice;
auto c = 3.0.sqrt;
auto eigenvalues = [(-1 + c * 1i) / 2, (-1 - c * 1i) / 2, 1 + 0i];
auto eigenvectors =
[[-1 + c * 1i , -1 - c * 1i , 2 + 0i],
[-1 - c * 1i , -1 + c * 1i , 2 + 0i],
[1 + 0i, 1 + 0i, 1 + 0i]].fuse;
auto res = data.eigen;
assert(res.eigenvalues.equal!approxEqual(eigenvalues));
foreach (i; 0 .. eigenvectors.length)
assert((res.eigenvectors.lightScope[i] / eigenvectors[i]).diff.slice.nrm2.approxEqual(0));
auto cdata = data.lightScope.as!cdouble.rcslice;
res = cdata.eigen;
assert(res.eigenvalues.equal!approxEqual(eigenvalues));
foreach (i; 0 .. eigenvectors.length)
assert((res.eigenvectors.lightScope[i] / eigenvectors[i]).diff.slice.nrm2.approxEqual(0));