Почему u8 не конвертируется в f32 или как считать строку в f32?

Доброго времени суток!
Я создал csv файл и хотел прочитать его содержимое .
1,0,0,0,0,0
2,0,0,0,0,0

Для этого я создал структуру MNIST
pub struct MNIST {
   pub labels:Vec<u8>,
   pub num_img:Vec<u8>
}

Читаю файл этим методом
pub fn read(&mut self, path:&str)  {
        let mut file = File::open(path).expect("err from ...");
        let mut reader = BufReader::new(file);
        let mut buf:Vec<u8> = Vec::new();
        let ra:u8 = 44; //  44 это запятая )))
        // читать  строку. затем первый элемент закинуть в labels остальное в num
        while reader.read_until(b'\n',&mut buf).expect("err from ...") != 0 {
            self.labels.push(buf[0]);
            for (i,v) in buf.iter().enumerate(){
                // если элемент не первый и не является запятой
                if i >0 && *v != ra  {self.num_img.push(*v)}
            }
            buf.clear();
        }
        
    }

Затем я меняю тип на f32 , но что то идет не так
pub fn get_labels(&self,out_lbl:usize,min:f32,tr:f32) -> Vec<Vec<f32>>{

        let mut labels:Vec<Vec<f32>> = Vec::new();
        let mut buf:Vec<f32> = Vec::new();

        // Заполняем labels
        for v in &self.labels {

            for j in 0..out_lbl {
                if *v as usize == j { buf.push(tr)} else {buf.push(*v as f32)  }
            }

            labels.push(buf.clone());
            buf.clear();
        }
        labels
    }

и я получаю вот это
вместо 1 - 49,
2- 50,
0 - 48,
вместо запятой - 44
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
@ziplane Автор вопроса
Поискав я нашел способ только со строками . Вкратце - читаем строку и кастуем ее в число. Я же решил пойти другим извращенным способом .
pub fn get_labels(&self,out_lbl:usize,min:f32,max:f32) -> Vec<Vec<f32>>{

        let mut labels:Vec<Vec<f32>> = Vec::new();
        let mut buf:Vec<f32> = Vec::new();

        // Заполняем labels
        for v in &self.labels {

            for j in 1..out_lbl {

                let mut buf_str = *v as char;
                let mut z = buf_str.to_digit(10).unwrap();
                if z as usize == j { buf.push(max)} else {buf.push(min)  }
            }

            labels.push(buf.clone());
            buf.clear();
        }
        labels
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы