// Fortran subroutine in EISPACK.
// Initialize
+ const int max_iters_count = 1000 * this->n;
+
int nn = this->n;
int n1 = nn - 1;
int low = 0;
}
}
- iter = iter + 1; // (Could check iteration count here.)
+ iter = iter + 1;
+ if (iter > max_iters_count)
+ CV_Error(Error::StsNoConv, "Algorithm doesn't converge (complex eigen values?)");
// Look for two consecutive small sub-diagonal elements
int m = n1 - 2;
}
INSTANTIATE_TEST_CASE_P(/**/, Core_EigenZero, testing::Values(2, 3, 5));
+TEST(Core_EigenNonSymmetric, convergence)
+{
+ Matx33d m(
+ 0, -1, 0,
+ 1, 0, 1,
+ 0, -1, 0);
+ Mat eigenvalues, eigenvectors;
+ // eigen values are complex, algorithm doesn't converge
+ EXPECT_THROW(cv::eigenNonSymmetric(m, eigenvalues, eigenvectors), cv::Exception); // exception instead of hang
+}
+
}} // namespace