comparison libinterp/corefcn/eig.cc @ 20525:ff904ae0285b

eig: Return correct solution for a pair of hermitian matrices (bug #45511) * liboctave/numeric/EIG.cc (EIG::init): Use correct form of hermitian_init. * liboctave/numeric/fEIG.cc (FloatEIG::init): Likewise. * libinterp/corefcn/eig.cc: Add %!test cases. Thanks to Marco Caliari for identifying the fix.
author Mike Miller <mtmiller@octave.org>
date Tue, 15 Sep 2015 08:48:35 -0400
parents 4f45eaf83908
children f90c8372b7ba
comparison
equal deleted inserted replaced
20524:ba4088aee342 20525:ff904ae0285b
322 %! A = [1, 2; 3, 8]; B = [8, 3; 4, 3]; 322 %! A = [1, 2; 3, 8]; B = [8, 3; 4, 3];
323 %! [v, d] = eig (A, B); 323 %! [v, d] = eig (A, B);
324 %! assert (A * v(:, 1), d(1, 1) * B * v(:, 1), sqrt (eps)); 324 %! assert (A * v(:, 1), d(1, 1) * B * v(:, 1), sqrt (eps));
325 %! assert (A * v(:, 2), d(2, 2) * B * v(:, 2), sqrt (eps)); 325 %! assert (A * v(:, 2), d(2, 2) * B * v(:, 2), sqrt (eps));
326 326
327 %!test
328 %! A = [1, 1+i; 1-i, 1]; B = [2, 0; 0, 2];
329 %! [v, d] = eig (A, B);
330 %! assert (A * v(:, 1), d(1, 1) * B * v(:, 1), sqrt (eps));
331 %! assert (A * v(:, 2), d(2, 2) * B * v(:, 2), sqrt (eps));
332
333 %!test
334 %! A = single ([1, 1+i; 1-i, 1]); B = single ([2, 0; 0, 2]);
335 %! [v, d] = eig (A, B);
336 %! assert (A * v(:, 1), d(1, 1) * B * v(:, 1), sqrt (eps ("single")));
337 %! assert (A * v(:, 2), d(2, 2) * B * v(:, 2), sqrt (eps ("single")));
338
327 %!error eig () 339 %!error eig ()
328 %!error eig ([1, 2; 3, 4], [4, 3; 2, 1], 1) 340 %!error eig ([1, 2; 3, 4], [4, 3; 2, 1], 1)
329 %!error <EIG requires same size matrices> eig ([1, 2; 3, 4], 2) 341 %!error <EIG requires same size matrices> eig ([1, 2; 3, 4], 2)
330 %!error <argument must be a square matrix> eig ([1, 2; 3, 4; 5, 6]) 342 %!error <argument must be a square matrix> eig ([1, 2; 3, 4; 5, 6])
331 %!error <wrong type argument> eig ("abcd") 343 %!error <wrong type argument> eig ("abcd")