[ https://issues.apache.org/jira/browse/MATH-1557?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Randy Strauss updated MATH-1557: -------------------------------- Attachment: real-eigen-vectors-test-case.txt > Enhancement request: Complex Eigen Vectors > ------------------------------------------ > > Key: MATH-1557 > URL: https://issues.apache.org/jira/browse/MATH-1557 > Project: Commons Math > Issue Type: Improvement > Affects Versions: 3.6.1 > Reporter: Randy Strauss > Priority: Major > Attachments: real-eigen-vectors-test-case.txt > > > I have a real hamiltonian matrix and need to get complex eigenvalues and > eigenvectors, just like MatLab produces (I'm moving code from MatLab to Java). > To give you a test case: > I wrap a RealMatrix in an RMatrix and add a name, to help with testing > and use this to set a single or multiple values on a single row, starting at > col c: > {{ public void set(int r, int c, double...val) {... > }} > Methods to create the hamiltonian matrix, the real and imaginary parts of the > eigenvectors (which this library creates) and the real and imaginary parts of > the eigenvectors follow. Note that the eigenvalues (evals) come as a > diagonal matrix. > (Meanwhile, I'll try the ojAlg library... The only other one I haven't > investigated is JEigen, a wrapper around the C++ eigen library...) > {{RMatrix getHam() {}} > {{ RMatrix mm = RMatrix.zeros(24,24).setName("ml:Ham()");}} > {{ mm.set(0,9, 1.0);}} > {{ mm.set(1,10, 1.0);}} > {{ mm.set(2,11, 1.0);}} > {{ mm.set(3,6, 1.0);}} > {{ mm.set(4,7, 1.0);}} > {{ mm.set(5,8, 1.0);}} > {{ mm.set(6,18, -50.2882527112151934);}} > {{ mm.set(7,19, -50.2882527112151934);}} > {{ mm.set(8,20, -104.6706084865823385);}} > {{ mm.set(9,3, -0.0000000000000012, -9.8066499999999994);}} > {{ mm.set(10,3, 9.8066499999999994, -0.0000000000000012);}} > {{ mm.set(11,23, -2.6882428037761028);}} > {{ mm.set(12,0, -1000.0);}} > {{ mm.set(13,1, -1000.0);}} > {{ mm.set(14,2, -50000.0);}} > {{ mm.set(15,3, -1000.0);}} > {{ mm.setRow(15,21, 0.0000000000000012, -9.8066499999999994);}} > {{ mm.set(16,4, -1000.0);}} > {{ mm.setRow(16,21, 9.8066499999999994, 0.0000000000000012);}} > {{ mm.set(17,5, -20.0);}} > {{ mm.set(18,6, -10.0);}} > {{ mm.set(18,15, -1.0);}} > {{ mm.set(19,7, -10.0);}} > {{ mm.set(19,16, -1.0);}} > {{ mm.set(20,8, -5.0);}} > {{ mm.set(20,17, -1.0);}} > {{ mm.set(21,9, -100.0);}} > {{ mm.set(21,12, -1.0);}} > {{ mm.set(22,10, -100.0);}} > {{ mm.set(22,13, -1.0);}} > {{ mm.set(23,11, -4000.0);}} > {{ mm.set(23,14, -1.0);}} > {{return mm;}} > {{ }}} > {{RMatrix getRealEvals() { > RMatrix mm = RMatrix.zeros(24,24).setName("ml:realEvals"); > mm.set(0,0, -19.2515559709009736); > mm.set(1,1, 19.2515559709010127); > mm.set(2,2, -11.0808348997399158); > mm.set(3,3, 11.0808348997399193); > mm.set(4,4, -2.7428623037015809); > mm.set(5,5, -2.7428623037015809); > mm.set(6,6, 2.7428623037015827); > mm.set(7,7, 2.7428623037015827); > mm.set(8,8, -103.636174429371124); > mm.set(9,9, 103.6361744293712093); > mm.set(10,10, -19.251555970901066); > mm.set(11,11, 19.2515559709010518); > mm.set(12,12, -11.0808348997399442); > mm.set(13,13, 11.0808348997399424); > mm.set(14,14, -22.7886373854221205); > mm.set(15,15, 22.7886373854220921); > mm.set(16,16, -2.7428623037015889); > mm.set(17,17, -2.7428623037015889); > mm.set(18,18, 2.742862303701588); > mm.set(19,19, 2.742862303701588); > mm.set(20,20, -3.5375930728932987); > mm.set(21,21, -2.0077471326476353); > mm.set(22,22, 2.0077471326476282); > mm.set(23,23, 3.5375930728932929); > return mm; > } > RMatrix getImagEvals() { > RMatrix mm = RMatrix.zeros(24,24).setName("ml:imagEvals"); > mm.set(4,4, 1.6690370723880767); > mm.set(5,5, -1.6690370723880767); > mm.set(6,6, 1.6690370723880767); > mm.set(7,7, -1.6690370723880767); > mm.set(16,16, 1.6690370723880816); > mm.set(17,17, -1.6690370723880816); > mm.set(18,18, 1.6690370723880807); > mm.set(19,19, -1.6690370723880807); > return mm; > } > RMatrix getRealEvecs() { > RMatrix mm = RMatrix.zeros(24,24).setName("ml:realEvecs"); > mm.set(0,0, 0.0004832230449602, -0.0004832230449602, -0.0009379501782333, > 0.0009379501782333, 0.0025918144777927, 0.0025918144777927, > 0.0025918144777927, 0.0025918144777927, -0.0, 0.0, -0.0, -0.0, -0.0, 0.0, > 0.0, -0.0, 0.0, 0.0, -0.0, -0.0, 0.0, -0.0, 0.0, -0.0); > mm.set(1,8, -0.0, 0.0, 0.0004832230449602, 0.0004832230449602, > -0.0009379501782333, 0.0009379501782333, -0.0, -0.0, -0.0025918144777927, > -0.0025918144777927, 0.0025918144777927, 0.0025918144777927, 0.0, 0.0, -0.0, > -0.0); > mm.set(2,8, 0.0002484038122836, -0.0002484038122836, 0.0, -0.0, 0.0, -0.0, > 0.0, 0.0, 0.0, 0.0, -0.0, -0.0, 0.0000707518552269, 0.0, -0.0, > 0.0000707518552269); > mm.set(3,0, -0.0, 0.0, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0, -0.0, 0.0, > 0.0182624329599153, 0.0182624329599153, -0.0117436760551143, > 0.0117436760551143, 0.0, -0.0, 0.0002203558678773, 0.0002203558678773, > -0.0002203558678772, -0.0002203558678772, -0.0, -0.0, -0.0, -0.0); > mm.set(4,0, -0.0182624329599153, 0.0182624329599153, 0.0117436760551143, > -0.0117436760551143, 0.0002203558678772, 0.0002203558678772, > 0.0002203558678772, 0.0002203558678772, 0.0, -0.0, -0.0, -0.0, 0.0, -0.0, > -0.0, 0.0, -0.0, -0.0, 0.0, 0.0, 0.0, 0.0, -0.0, 0.0); > mm.set(5,0, -0.0, -0.0, 0.0, 0.0, -0.0, -0.0, 0.0, 0.0, 0.0, > 0.0000000000000002, 0.0, -0.0000000000000001, -0.0000000000000001, -0.0, > -0.0428074741554847, -0.0428074741554848, -0.0000000000000001, > -0.0000000000000001, -0.0, -0.0, -0.0, 0.0979346456757011, 0.097934645675701, > -0.0); > mm.set(6,0, 0.0, 0.0, -0.0, -0.0, -0.0, -0.0, 0.0, 0.0, -0.0000000000000002, > -0.0000000000000002, -0.3515802502926373, 0.3515802502926377, > 0.1301297354827506, 0.1301297354827507, -0.0000000000000002, -0.0, > -0.0059148347790043, -0.0059148347790043, -0.0059148347790042, > -0.0059148347790042, 0.0, -0.0, 0.0, -0.0); > mm.set(7,0, 0.3515802502926374, 0.3515802502926376, -0.1301297354827509, > -0.1301297354827506, -0.0059148347790042, -0.0059148347790042, > 0.0059148347790041, 0.0059148347790041, 0.0, 0.0, 0.0, -0.0, -0.0, -0.0, > 0.0000000000000001, 0.0000000000000001, 0.0, 0.0, 0.0, 0.0, 0.0, -0.0, -0.0, > -0.0); > mm.set(8,8, 0.0000000000000001, -0.0000000000000023, -0.0000000000000002, > -0.0000000000000003, 0.0, 0.0, 0.9755240059151693, -0.9755240059151695, > -0.0000000000000002, -0.0000000000000002, -0.0000000000000002, > -0.0000000000000002, 0.0, -0.196628004042251, 0.1966280040422509, -0.0); > mm.set(9,0, -0.0093027954964812, -0.0093027954964812, 0.0103932710691854, > 0.0103932710691854, -0.0044767115132939, -0.0044767115132939, > 0.0044767115132939, 0.0044767115132939, 0.0, 0.0, 0.0, -0.0, 0.0, 0.0, -0.0, > -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, 0.0, 0.0, -0.0); > mm.set(10,0, 0.0, 0.0, -0.0, -0.0, 0.0, 0.0, -0.0, -0.0, 0.0, 0.0, > -0.0093027954964812, 0.0093027954964812, 0.0103932710691854, > 0.0103932710691854, -0.0, -0.0, 0.0044767115132939, 0.0044767115132939, > 0.0044767115132939, 0.0044767115132939, 0.0, 0.0, -0.0, -0.0); > mm.set(11,8, -0.0257436208187483, -0.0257436208187483, -0.0, -0.0, 0.0, 0.0, > 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.0002502912729449, -0.0, 0.0, > 0.0002502912729449); > mm.set(12,0, 0.0251004669799487, 0.0251004669799487, -0.0846461649072455, > -0.0846461649072456, 0.9449305837536955, 0.9449305837536955, > -0.9449305837536957, -0.9449305837536957, -0.0, -0.0, -0.0, 0.0, -0.0, -0.0, > 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.0, -0.0, 0.0); > mm.set(13,8, -0.0000000000000015, -0.0000000000000004, 0.0251004669799488, > -0.0251004669799487, -0.0846461649072455, -0.0846461649072455, > -0.0000000000000004, 0.0000000000000001, -0.9449305837536948, > -0.9449305837536948, -0.9449305837536955, -0.9449305837536955, > 0.0000000000000001, 0.0000000000000013, 0.0000000000000009, > 0.0000000000000005); > mm.set(14,8, 0.1198441633200829, 0.1198441633200825, -0.0, -0.0, -0.0, 0.0, > 0.0000000000000001, -0.0000000000000001, 0.0000000000000006, > 0.0000000000000006, 0.0000000000000005, 0.0000000000000005, > 0.9999999119316623, -0.0000000000000004, -0.0000000000000014, > -0.9999999119316623); > mm.set(15,0, -0.0000000000000001, -0.0000000000000001, 0.0000000000000001, > 0.0000000000000001, 0.0, 0.0, -0.0, -0.0, -0.0000000000000047, > 0.0000000000000008, 0.9246701470035759, -0.9246701470035759, > -0.9835697352164537, -0.9835697352164535, 0.0000000000000004, > -0.0000000000000002, 0.0570691616413982, 0.0570691616413982, > 0.0570691616413963, 0.0570691616413963, -0.0000000000000002, > -0.0000000000000001, -0.0000000000000001, 0.0000000000000001); > mm.set(16,0, -0.9246701470035759, -0.9246701470035759, 0.9835697352164536, > 0.9835697352164536, 0.0570691616413962, 0.0570691616413962, > -0.0570691616413952, -0.0570691616413952, 0.0, 0.0, -0.0000000000000001, > 0.0000000000000001, 0.0000000000000002, 0.0000000000000002, > -0.0000000000000001, -0.0000000000000001, -0.0, -0.0, -0.0, -0.0, 0.0, > 0.0000000000000001, 0.0000000000000001, -0.0); > mm.set(17,8, -0.0000000000000004, 0.0000000000000007, 0.0000000000000001, > 0.0000000000000001, -0.0000000000000001, 0.0000000000000001, > -0.0375691388927618, 0.0375691388927611, -0.0000000000000005, > -0.0000000000000005, 0.0000000000000003, 0.0000000000000003, > -0.0000000000000001, 0.9755675312214632, -0.9755675312214632, > 0.0000000000000002); > mm.set(18,0, 0.0, -0.0, -0.0, 0.0, -0.0, -0.0, -0.0, -0.0, > -0.0000000000000002, -0.0, -0.1345933990914463, -0.1345933990914461, > 0.0286736173299098, -0.0286736173299096, -0.0000000000000001, 0.0, > -0.0006000508905014, -0.0006000508905014, 0.0006000508905015, > 0.0006000508905015, -0.0, -0.0, -0.0, 0.0); > mm.set(19,0, 0.1345933990914462, -0.1345933990914462, -0.0286736173299099, > 0.0286736173299098, -0.0006000508905014, -0.0006000508905014, > -0.0006000508905014, -0.0006000508905014, 0.0, 0.0, 0.0, 0.0, -0.0, 0.0, 0.0, > -0.0, 0.0, 0.0, -0.0, -0.0, 0.0, 0.0, -0.0, 0.0); > mm.set(20,8, -0.0000000000000001, 0.0000000000000003, -0.0, > 0.0000000000000001, 0.0, -0.0, 0.2123887799355335, 0.2123887799355333, > -0.0000000000000001, -0.0000000000000001, -0.0, -0.0, 0.0, > -0.0037716348172817, -0.0037716348172816, -0.0); > mm.set(21,0, -0.0470184895203464, 0.0470184895203463, 0.0861560478654635, > -0.0861560478654635, -0.0077681276851642, -0.0077681276851642, > -0.0077681276851642, -0.0077681276851642, 0.0, -0.0, 0.0, 0.0, 0.0, -0.0, > -0.0, 0.0, -0.0, -0.0, 0.0, 0.0, -0.0, -0.0, 0.0, 0.0); > mm.set(22,8, -0.0000000000000011, -0.0000000000000002, -0.0470184895203463, > -0.0470184895203464, 0.0861560478654634, -0.0861560478654634, > -0.0000000000000001, 0.0, 0.007768127685165, 0.007768127685165, > -0.0077681276851632, -0.0077681276851632, 0.0000000000000002, > 0.0000000000000007, -0.0000000000000001, 0.0000000000000001); > mm.set(23,8, -0.9924588559737858, 0.9924588559737859, -0.0, 0.0, > -0.0000000000000001, -0.0, -0.0, -0.0000000000000001, -0.0, -0.0, 0.0, 0.0, > -0.0003293707964667, -0.0, 0.0, -0.0003293707964667); > return mm; > } > @Override RMatrix getImagEvecs() { > RMatrix mm = RMatrix.zeros(24,24).setName("ml:imagEvecs"); > mm.set(0,4, -0.0015771241751182, 0.0015771241751182, 0.0015771241751182, > -0.0015771241751182); > mm.set(0,16, 0.0, -0.0, -0.0, 0.0); > mm.set(1,16, 0.0015771241751182, -0.0015771241751182, 0.0015771241751182, > -0.0015771241751182); > mm.set(2,16, -0.0, 0.0, 0.0, -0.0); > mm.set(3,4, 0.0, -0.0, -0.0, 0.0); > mm.set(3,16, 0.0031817321876536, -0.0031817321876536, 0.0031817321876535, > -0.0031817321876535); > mm.set(4,4, 0.0031817321876535, -0.0031817321876535, -0.0031817321876535, > 0.0031817321876535); > mm.set(4,16, -0.0, 0.0, -0.0, 0.0); > mm.set(5,4, 0.0, -0.0, 0.0, -0.0); > mm.set(5,16, 0.0, -0.0, -0.0, 0.0); > mm.set(6,4, -0.0, 0.0, -0.0, 0.0); > mm.set(6,16, -0.0083592711653836, 0.0083592711653836, 0.0083592711653836, > -0.0083592711653836); > mm.set(7,4, -0.0083592711653836, 0.0083592711653836, -0.0083592711653835, > 0.0083592711653835); > mm.set(7,16, 0.0, -0.0, -0.0, 0.0); > mm.set(8,16, 0.0000000000000001, -0.0000000000000001, 0.0000000000000001, > -0.0000000000000001); > mm.set(9,4, 0.0086516688963765, -0.0086516688963765, 0.0086516688963765, > -0.0086516688963765); > mm.set(9,16, 0.0, -0.0, -0.0, 0.0); > mm.set(10,4, -0.0, 0.0, -0.0, 0.0); > mm.set(10,16, -0.0086516688963765, 0.0086516688963765, 0.0086516688963765, > -0.0086516688963765); > mm.set(11,16, -0.0, 0.0, 0.0, -0.0); > mm.set(12,16, 0.0, -0.0, -0.0, 0.0); > mm.set(14,16, 0.0000000000000003, -0.0000000000000003, -0.0000000000000007, > 0.0000000000000007); > mm.set(15,4, 0.0, -0.0, 0.0, -0.0); > mm.set(15,16, 0.0838820942848218, -0.0838820942848218, -0.0838820942848232, > 0.0838820942848232); > mm.set(16,4, 0.0838820942848225, -0.0838820942848225, 0.0838820942848227, > -0.0838820942848227); > mm.set(16,16, -0.0, 0.0, 0.0, -0.0); > mm.set(17,16, 0.0, -0.0, 0.0, -0.0); > mm.set(18,4, -0.0, 0.0, 0.0, -0.0); > mm.set(18,16, -0.0002596282538929, 0.0002596282538929, -0.0002596282538928, > 0.0002596282538928); > mm.set(19,4, -0.000259628253893, 0.000259628253893, 0.000259628253893, > -0.000259628253893); > mm.set(19,16, 0.0, -0.0, 0.0, -0.0); > mm.set(20,16, 0.0, -0.0, 0.0, -0.0); > mm.set(21,4, 0.310697914145376, -0.310697914145376, -0.3106979141453762, > 0.3106979141453762); > mm.set(21,16, 0.0, -0.0, 0.0, -0.0); > mm.set(22,16, -0.310697914145378, 0.310697914145378, -0.310697914145376, > 0.310697914145376); > mm.set(23,16, 0.0000000000000001, -0.0000000000000001, -0.0, 0.0); > return mm; > } > }} -- This message was sent by Atlassian Jira (v8.3.4#803005)