0

I have an OLS fitting function that returns an OMatrix. The return type should always be a one-dimensional vector of coefficients.

use std::f64::NAN;
use nalgebra::{DMatrix, Dynamic, MatrixSlice, OMatrix, RowVector};

fn ols(
    x: MatrixSlice<f64, Dynamic, Dynamic>,
    y: MatrixSlice<f64, Dynamic, Dynamic>,
) -> OMatrix<f64, Dynamic, Dynamic> {
    (x.transpose() * x).pseudo_inverse(0.00001).unwrap() * x.transpose() * y
}

The output of ols will always have the same number of elements which is equal to the number of columns as the input x (I'm not sure how I can change the return signature to represent this, I'm new to rust).

The output of ols should then be copied to a single row of an output matrix out. I am trying to do this with the set_row function, but I get the error expected struct 'Const', found struct 'Dynamic'.

fn my_func(
    x: &DMatrix<f64>,  // data matrix
    y: &DMatrix<f64>,  // target matrix, actually a matrix with only 1 column
) -> DMatrix<f64> {
    let nrows = x.shape().0;
    let ncols = x.shape().1;
    // initialize out matrix to all NAN's
    let mut out = DMatrix::from_element(nrows, ncols, NAN);
    let i: usize = 100;
    let tmp_x: MatrixSlice<f64, Dynamic, Dynamic> = x.slice((i, 0), (50, ncols));
    let tmp_y: MatrixSlice<f64, Dynamic, Dynamic> = y.slice((i, 0), (50, 1));
    // the next two lines are where I need help
    let ols_coefs = ols(tmp_x, tmp_y);
    out.set_row(i, &ols_coefs);  // error occurs here
    return out;
}

I suspect I need to convert the type of the output of ols somehow, but I am not sure how.

E_net4
  • 27,810
  • 13
  • 101
  • 139
PyRsquared
  • 6,970
  • 11
  • 50
  • 86

0 Answers0