void roots(const vec &p, cvec &r) { int n = p.size(), m, l; ivec f = find(p != 0.0); m = f.size(); vec v = p; mat A; if (m > 0 && n > 1) { v = v(f(0), f(m - 1)); l = v.size(); if (l > 1) { A = diag(ones(l - 2), -1); A.set_row(0, -v(1, l - 1) / v(0)); r = eig(A); cvec d; cmat V; eig(A, d , V); if (f(m - 1) < n) r = concat(r, zeros_c(n - f(m - 1) - 1)); } else { r.set_size(n - f(m - 1) - 1, false); r.zeros(); } } else r.set_size(0, false); }
void roots(const cvec &p, cvec &r) { int n = p.size(), m, l; ivec f; // find all non-zero elements for (int i = 0; i < n; i++) if (p(i) != 0.0) f = concat(f, i); m = f.size(); cvec v = p; cmat A; if (m > 0 && n > 1) { v = v(f(0), f(m - 1)); l = v.size(); if (l > 1) { A = diag(ones_c(l - 2), -1); A.set_row(0, -v(1, l - 1) / v(0)); r = eig(A); if (f(m - 1) < n) r = concat(r, zeros_c(n - f(m - 1) - 1)); } else { r.set_size(n - f(m - 1) - 1, false); r.zeros(); } } else r.set_size(0, false); }
void poly(const cvec &r, cvec &p) { int n = r.size(); p.set_size(n + 1, false); p.zeros(); p(0) = 1.0; for (int i = 0; i < n; i++) p.set_subvector(1, p(1, i + 1) - r(i)*p(0, i)); }