func test_trdevd(N, flags, kind int, verbose bool, t *testing.T) { var At, sD, sE, tmp cmat.FloatMatrix A0 := cmat.NewMatrix(N, N) desc := setTrdDiagonals(A0, kind) At.SubMatrix(A0, 0, 0, N, N) sD.Diag(A0, 0) sE.Diag(A0, 1) D := cmat.NewCopy(&sD) E := cmat.NewCopy(&sE) V := cmat.NewMatrix(N, N) sD.Diag(V, 0) sD.Add(1.0) W := cmat.NewMatrix(4*N, 1) C := cmat.NewMatrix(N, N) if verbose && N < 10 { t.Logf("A0:\n%v\n", A0.ToString("%6.3f")) t.Logf("V.pre:\n%v\n", V.ToString("%6.3f")) } lapackd.TRDEigen(D, E, V, W, flags|gomas.WANTV) for k := 0; k < N-1; k++ { if E.GetAt(k) != 0.0 { t.Logf("E[%d] != 0.0 (%e)\n", k, E.GetAt(k)) } } blasd.Mult(C, V, V, 1.0, 0.0, gomas.TRANSB) sD.Diag(C) sD.Add(-1.0) nrmv := lapackd.NormP(C, lapackd.NORM_ONE) blasd.Mult(C, V, A0, 1.0, 0.0, gomas.TRANSA) blasd.Mult(&At, C, V, 1.0, 0.0, gomas.NONE) if verbose && N < 10 { t.Logf("D:\n%v\n", asRow(&tmp, D).ToString("%6.3f")) t.Logf("V:\n%v\n", V.ToString("%6.3f")) t.Logf("V.T*A*V\n%v\n", At.ToString("%6.3f")) } sD.Diag(&At) blasd.Axpy(&sD, D, -1.0) nrma := lapackd.NormP(&At, lapackd.NORM_ONE) t.Logf("N=%d [%s] ||V.T*A*V - eigen(A)||_1: %e\n", N, desc, nrma) t.Logf(" ||I - V.T*V||_1: %e\n", nrmv) }
func test_bdsvd(N, flags, kind int, verbose bool, t *testing.T) { var At, sD, sE, tmp cmat.FloatMatrix uplo := "upper" offdiag := 1 if flags&gomas.LOWER != 0 { offdiag = -1 uplo = "lower" } A0 := cmat.NewMatrix(N, N) desc := setDiagonals(A0, offdiag, kind) At.SubMatrix(A0, 0, 0, N, N) sD.Diag(A0, 0) sE.Diag(A0, offdiag) D := cmat.NewCopy(&sD) E := cmat.NewCopy(&sE) // unit singular vectors U := cmat.NewMatrix(N, N) sD.Diag(U, 0) sD.Add(1.0) V := cmat.NewMatrix(N, N) sD.Diag(V, 0) sD.Add(1.0) W := cmat.NewMatrix(4*N, 1) C := cmat.NewMatrix(N, N) lapackd.BDSvd(D, E, U, V, W, flags|gomas.WANTU|gomas.WANTV) blasd.Mult(C, U, U, 1.0, 0.0, gomas.TRANSA) sD.Diag(C) sD.Add(-1.0) nrmu := lapackd.NormP(C, lapackd.NORM_ONE) blasd.Mult(C, V, V, 1.0, 0.0, gomas.TRANSB) sD.Add(-1.0) nrmv := lapackd.NormP(C, lapackd.NORM_ONE) blasd.Mult(C, U, A0, 1.0, 0.0, gomas.TRANSA) blasd.Mult(&At, C, V, 1.0, 0.0, gomas.TRANSB) if verbose && N < 10 { t.Logf("D:\n%v\n", asRow(&tmp, D)) t.Logf("U:\n%v\n", U) t.Logf("V:\n%v\n", V) t.Logf("U.T*A*V\n%v\n", &At) } sD.Diag(&At) blasd.Axpy(&sD, D, -1.0) nrma := lapackd.NormP(&At, lapackd.NORM_ONE) t.Logf("N=%d [%s,%s] ||U.T*A*V - bdsvd(A)||_1: %e\n", N, uplo, desc, nrma) t.Logf(" ||I - U.T*U||_1: %e\n", nrmu) t.Logf(" ||I - V.T*V||_1: %e\n", nrmv) }
func test1(N int, beta float64, t *testing.T) { var sI cmat.FloatMatrix if N&0x1 != 0 { N = N + 1 } D := cmat.NewMatrix(N, 1) Z := cmat.NewMatrix(N, 1) Y := cmat.NewMatrix(N, 1) V := cmat.NewMatrix(N, 1) Q := cmat.NewMatrix(N, N) I := cmat.NewMatrix(N, N) D.SetAt(0, 1.0) Z.SetAt(0, 2.0) for i := 1; i < N-1; i++ { if i < N/2 { D.SetAt(i, 2.0-float64(N/2-i)*beta) } else { D.SetAt(i, 2.0+float64(i+1-N/2)*beta) } Z.SetAt(i, beta) } D.SetAt(N-1, 10.0/3.0) Z.SetAt(N-1, 2.0) w := blasd.Nrm2(Z) blasd.InvScale(Z, w) rho := 1.0 / (w * w) lapackd.TRDSecularSolveAll(Y, V, Q, D, Z, rho) lapackd.TRDSecularEigen(Q, V, nil) blasd.Mult(I, Q, Q, 1.0, 0.0, gomas.TRANSA) sI.Diag(I) sI.Add(-1.0) nrm := lapackd.NormP(I, lapackd.NORM_ONE) t.Logf("N=%d, beta=%e ||I - Q.T*Q||_1: %e\n", N, beta, nrm) }