()
| 694 | } |
| 695 | |
| 696 | @Override |
| 697 | public Matrix[] qr() |
| 698 | { |
| 699 | int N = cols(), M = rows(); |
| 700 | Matrix[] qr = new Matrix[2]; |
| 701 | |
| 702 | Matrix Q = Matrix.eye(M); |
| 703 | Matrix A; |
| 704 | if(isSquare()) |
| 705 | { |
| 706 | mutableTranspose(); |
| 707 | A = this; |
| 708 | } |
| 709 | else |
| 710 | A = this.transpose(); |
| 711 | int to = cols() > rows() ? M : N; |
| 712 | double[] vk = new double[M]; |
| 713 | for(int k = 0; k < to; k++) |
| 714 | { |
| 715 | |
| 716 | double vkNorm = initalVKNormCompute(k, M, vk, A); |
| 717 | double beta = vkNorm; |
| 718 | |
| 719 | double vk_k = vk[k] = A.get(k, k);//force into register, help the JIT! |
| 720 | vkNorm += vk_k*vk_k; |
| 721 | vkNorm = sqrt(vkNorm); |
| 722 | |
| 723 | |
| 724 | double alpha = -signum(vk_k) * vkNorm; |
| 725 | vk_k -= alpha; |
| 726 | vk[k] = vk_k; |
| 727 | beta += vk_k*vk_k; |
| 728 | |
| 729 | |
| 730 | if (beta == 0) |
| 731 | continue; |
| 732 | double TwoOverBeta = 2.0 / beta; |
| 733 | |
| 734 | qrUpdateQ(Q, k, vk, TwoOverBeta); |
| 735 | qrUpdateR(k, N, A, vk, TwoOverBeta, M); |
| 736 | } |
| 737 | qr[0] = Q; |
| 738 | if(isSquare()) |
| 739 | { |
| 740 | A.mutableTranspose(); |
| 741 | qr[1] = A; |
| 742 | } |
| 743 | else |
| 744 | qr[1] = A.transpose(); |
| 745 | return qr; |
| 746 | } |
| 747 | |
| 748 | private void qrUpdateR(int k, int N, Matrix A, double[] vk, double TwoOverBeta, int M) |
| 749 | { |
nothing calls this directly
no test coverage detected