func checkGesvd(ind *linalg.IndexOpts, pars *linalg.Parameters, A, S, U, Vt matrix.Matrix) error { if ind.M < 0 { ind.M = A.Rows() } if ind.N < 0 { ind.N = A.Cols() } if ind.M == 0 || ind.N == 0 { return nil } if pars.Jobu == linalg.PJobO && pars.Jobvt == linalg.PJobO { return errors.New("Gesvd: jobu and jobvt cannot both have value PJobO") } if pars.Jobu == linalg.PJobAll || pars.Jobu == linalg.PJobS { if U == nil { return errors.New("Gesvd: missing matrix U") } if ind.LDu == 0 { ind.LDu = max(1, U.Rows()) } if ind.LDu < max(1, ind.M) { return errors.New("Gesvd: ldU") } } else { if ind.LDu == 0 { ind.LDu = 1 } if ind.LDu < 1 { return errors.New("Gesvd: ldU") } } if pars.Jobvt == linalg.PJobAll || pars.Jobvt == linalg.PJobS { if Vt == nil { return errors.New("Gesvd: missing matrix Vt") } if ind.LDvt == 0 { ind.LDvt = max(1, Vt.Rows()) } if pars.Jobvt == linalg.PJobAll && ind.LDvt < max(1, ind.N) { return errors.New("Gesvd: ldVt") } else if pars.Jobvt != linalg.PJobAll && ind.LDvt < max(1, min(ind.M, ind.N)) { return errors.New("Gesvd: ldVt") } } else { if ind.LDvt == 0 { ind.LDvt = 1 } if ind.LDvt < 1 { return errors.New("Gesvd: ldVt") } } if ind.OffsetA < 0 { return errors.New("Gesvd: offsetA") } sizeA := A.NumElements() if sizeA < ind.OffsetA+(ind.N-1)*ind.LDa+ind.M { return errors.New("Gesvd: sizeA") } if ind.OffsetS < 0 { return errors.New("Gesvd: offsetS") } sizeS := S.NumElements() if sizeS < ind.OffsetS+min(ind.M, ind.N) { return errors.New("Gesvd: sizeA") } /* if U != nil { if ind.OffsetU < 0 { return errors.New("Gesvd: OffsetU") } sizeU := U.NumElements() if pars.Jobu == linalg.PJobAll && sizeU < ind.LDu*(ind.M-1) { return errors.New("Gesvd: sizeU") } else if pars.Jobu == linalg.PJobS && sizeU < ind.LDu*(min(ind.M,ind.N)-1) { return errors.New("Gesvd: sizeU") } } if Vt != nil { if ind.OffsetVt < 0 { return errors.New("Gesvd: OffsetVt") } sizeVt := Vt.NumElements() if pars.Jobvt == linalg.PJobAll && sizeVt < ind.N { return errors.New("Gesvd: sizeVt") } else if pars.Jobvt == linalg.PJobS && sizeVt < min(ind.M, ind.N) { return errors.New("Gesvd: sizeVt") } } */ return nil }