2015-11-17 2 views
2

В настоящее время я работаю над простым проектом, чтобы познакомиться с Rust. У меня мало опыта в системном программировании, но я надеюсь учиться!Создание структуры с массивом (Matrices)

Я пытаюсь создать структуру Матрицы, но мне трудно понять, как я должен хранить данные. Я чувствую, что могу использовать массив. Размер матрицы должен быть определен при построении, поэтому я надеюсь, что смогу сохранить массив в стеке.

Прямо сейчас мой код выглядит следующим образом:

use std::ops::Mul; 
use std::ops::Add; 
use std::ops::Div; 

struct Matrix { 
    cols: i32, 
    rows: i32, 
    // Of course this doesn't work! 
    data: [f32; ..cols*rows] 
} 

// Below here are a bunch of stub methods. 
impl Mul<f32> for Matrix { 
    type Output = Matrix; 

    fn mul(self, m: f32) -> Matrix { 
     return self; 
    } 
} 

impl Mul<Matrix> for Matrix { 
    type Output = Matrix; 

    fn mul(self, m: Matrix) -> Matrix { 
     // Will use Strassen algorithm if large, traditional otherwise 
     return self; 
    } 
} 

impl Add<Matrix> for Matrix { 
    type Output = Matrix; 

    fn add(self, m: Matrix) -> Matrix { 
     return self; 
    } 
} 

impl Div<f32> for Matrix { 
    type Output = Matrix; 

    fn div(self, f: f32) -> Matrix { 
     return self; 
    } 
} 

ответ

3

Самый простой способ сделать это было бы с Vec.

struct Matrix { 
    cols: i32, 
    rows: i32, 
    data: Vec<f32> 
} 

impl Matrix { 
    fn new(cols: i32, rows: i32) -> Matrix { 
     Matrix { 
      cols: cols, 
      rows: rows, 
      data: vec![0.0; cols * rows] 
     } 
    } 
} 

Если вы не хотите хранить данные в куче, вы могли бы сделать Matrix в тип динамически размера, но это трудно сделать, и на самом деле не поддерживается. См. a Reddit thread on that topic.

Если вы не хотите использовать Vec, но все в порядке с хранением данных в куче, вы можете использовать вместо этого коробчатый срез (Box<[f32]>). См. Vec::into_boxed_slice для одного способа его создания.

И, конечно, если вы действительно не хотите использовать кучу, вы можете сделать разные типы Matrix для различных размеров матриц. Это то, что делает ящик nalgebra.

+0

Спасибо за ответ - это помогло мне понять, что происходит дальше. Динамический размер выглядит правдоподобным, но я согласен, что это хлопот, и я не уверен, что он позволит мне делать такие вещи, как сделать матрицу по умолчанию всеми нулями (без подачи массива в конструктор). Я хотел бы иметь данные в стеке, но сейчас я попробую реализовать, используя вложенные в квадрат кусочки. Благодаря! – user124784

+0

Я проверил код для nalgebra. Проблема заключается в том, что я планирую использовать это в настройке машинного обучения - так что матрицы огромных размеров будут распространены. D: – user124784

+0

@ user124784 Наверное, лучше всего использовать кучу, так как хранить огромные вещи в стеке, как правило, плохая идея. – Adrian

Смежные вопросы