ProjectCol projects values from the given column of given table (via IndexView) onto the idx'th eigenvector (0 = largest eigenvalue, 1 = next, etc). Must have already called SVD() method.
(vals *[]float64, ix *table.IndexView, column string, idx int)
| 161 | // onto the idx'th eigenvector (0 = largest eigenvalue, 1 = next, etc). |
| 162 | // Must have already called SVD() method. |
| 163 | func (svd *SVD) ProjectCol(vals *[]float64, ix *table.IndexView, column string, idx int) error { |
| 164 | col, err := ix.Table.ColumnByNameTry(column) |
| 165 | if err != nil { |
| 166 | return err |
| 167 | } |
| 168 | if svd.Vectors == nil { |
| 169 | return fmt.Errorf("SVD.ProjectCol Vectors are nil -- must call SVD first") |
| 170 | } |
| 171 | nr := svd.Vectors.DimSize(0) |
| 172 | if idx >= nr { |
| 173 | return fmt.Errorf("SVD.ProjectCol eigenvector index > rank of matrix") |
| 174 | } |
| 175 | cvec := make([]float64, nr) |
| 176 | // eidx := nr - 1 - idx // eigens in reverse order |
| 177 | vec := svd.Vectors.(*tensor.Float64) |
| 178 | for ri := 0; ri < nr; ri++ { |
| 179 | cvec[ri] = vec.Value([]int{ri, idx}) // vecs are in columns, reverse magnitude order |
| 180 | } |
| 181 | rows := ix.Len() |
| 182 | if len(*vals) != rows { |
| 183 | *vals = make([]float64, rows) |
| 184 | } |
| 185 | ln := col.Len() |
| 186 | sz := ln / col.DimSize(0) // size of cell |
| 187 | if sz != nr { |
| 188 | return fmt.Errorf("SVD.ProjectCol column cell size != svd eigenvectors") |
| 189 | } |
| 190 | rdim := []int{0} |
| 191 | for row := 0; row < rows; row++ { |
| 192 | sum := 0.0 |
| 193 | rdim[0] = ix.Indexes[row] |
| 194 | rt := col.SubSpace(rdim) |
| 195 | for ci := 0; ci < sz; ci++ { |
| 196 | sum += cvec[ci] * rt.Float1D(ci) |
| 197 | } |
| 198 | (*vals)[row] = sum |
| 199 | } |
| 200 | return nil |
| 201 | } |
| 202 | |
| 203 | // ProjectColToTable projects values from the given column of given table (via IndexView) |
| 204 | // onto the given set of eigenvectors (idxs, 0 = largest eigenvalue, 1 = next, etc), |
no test coverage detected