Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Как проще всего считать матрицу(f64) из файла на Rust?

#файлы #матрицы #rust


Содержимое файла, матрица квадратная, в первой строке после # указан размер.

#3
1.1 -0.2 0.1
0.1 -1.2 -0.2
0.2 -0.1 1.1


Примерно так я бы считал ее на Си.

double **A;
int i,j,size=0;
FILE *f=NULL;

f=fopen("input.txt","w");
fscanf(f,"#%d\n",&size);
A=(double**)malloc(size*sizeof(double*));
for(i=0;i


Ответы

Ответ 1



Перевод моего кода с Си на Rust use std::fs::File; use std::io::{BufRead, BufReader}; fn main() { // open the file let mut f = BufReader::new(File::open("input.txt").unwrap()); // read the first line and extract the number from it let mut num_line = String::new(); f.read_line(&mut num_line).unwrap(); let n: usize = num_line[1..].trim().parse().unwrap(); // preallocate the array and read the data into it let mut arr = vec![vec![0f64; n]; n]; for (i, line) in f.lines().enumerate() { for (j, number) in line.unwrap().split(char::is_whitespace).enumerate() { arr[i][j] = number.trim().parse().unwrap(); } } println!("{:?}", arr); } Более характерный код для Rust use std::fs::File; use std::io::{BufRead, BufReader}; fn main() { let mut f = BufReader::new(File::open("input.txt").unwrap()); let mut num_line = String::new(); f.read_line(&mut num_line).unwrap(); let n: usize = num_line[1..].trim().parse().unwrap(); let arr: Vec> = f.lines() .take(n) .map(|l| l.unwrap().split(char::is_whitespace) .take(n) .map(|number| number.parse().unwrap()) .collect()) .collect(); println!("{:?}", arr); } Без учета размерности, указанной в первой строке use std::fs::File; use std::io::{BufRead, BufReader}; fn main() { let mut f = BufReader::new(File::open("input.txt").unwrap()); let mut s = String::new(); f.read_line(&mut s).unwrap(); let arr: Vec> = f.lines() .map(|l| l.unwrap().split(char::is_whitespace) .map(|number| number.parse().unwrap()) .collect()) .collect(); println!("{:?}", arr); }

Комментариев нет:

Отправить комментарий