2016-11-03 13 views
0

私は行列計算を行うことでRustを学んでいます。最初のステップは、新しい行と列の行列を作成し、要素を行優先順序で初期化します。&[T]タイプの入力ベクトルをVecに変換します<T>

入力行列値ベクトルを& [T]として渡したいが、要素値で行列を初期化する方法がわからない。このpostに基づい

pub struct Matrix<T> { 
    data: Vec<T>, 
    row: usize, 
    col: usize, 
} 

/// Creates a new matrix of `row` rows and `col` columns, and initializes 
/// the matrix with the elements in `values` in row-major order. 
pub fn new(row: usize, col: usize, values: &[T]) -> Matrix<T> { 
    Matrix { 
     data: *values, // ?? 
     row: row, 
     col: col, 
    } 
} 


fn main() { 
    let x = Matrix::new(2, 3, &[-2, -1, 0, 1, 2, 3]); 
    let y = Matrix::new(2, 3, &[0, 0, 0, 0, 0, 0]); 
    // z = x + y; 

} 

、& [T]はメモリに順次レイアウトされたTSのセットへの参照です。それは、すべての "スライス"をポインタからベクトル型に変換することができないことを意味しますか?唯一の方法は、ループを使って各項目のderefを行い、それらを新しいベクトルに格納することです。

+0

個人的に、私はちょうど 'Vec'を受け入れるnew''になるだろう。そうすることで、呼び出し側にクローンを課すことはありません。呼び出し側はデータを複製するか、Vecの所有権を渡すかを決めることができます。 –

答えて

5

可能ですが、*(逆参照)はできません。あなたが参照してください、&[T]を借りて、それを維持することはできませんです。タイプMatrix<T>は、dataを所有しています。あなたは単に何かを借りて(values)、あなたが所有しているかのようにそれを放棄することはできません(「ここでは、行列、これらの値を取る、あなたはそれらを保つことができます」)。

借用したデータをコピーして所有タイプ(Vec<T>)として保存することができます。あなたが所有しているので、データのこのコピーを譲渡することができます。所有に借りたからの変換は、例えば、to_owned()方法により行うことができます。

pub fn new(row: usize, col: usize, values: &[T]) -> Matrix<T> { 
    Matrix { 
     data: values.to_owned(), 
     //   ^^^^^^^^^^^ 
     row: row, 
     col: col, 
    } 
} 
+0

ありがとう@Lukas、フォローアップの質問:to_own()を使ってfn new()が行列の所有権を取る場合、元の行列は存在しません。行列を追加したいのであれば問題になるでしょうか?私は所有権を取らずに新しい行列を初期化するべきかもしれないと思っています。 – enaJ

+1

@enaJわかりませんが、 'new()'関数は何も所有していません。 'to_owned()'は*借用した*ものをコピーして*所有しているものを返します。友達があなたに本を貸しているように。あなたはその本に書き込んだり、自分のふりをしたりしない方がよいでしょう。しかし、あなたが手紙のために本の手紙をコピーする場合、あなたはあなた自身のバージョンを持っています。 –

+0

to_owned()は、借用したオブジェクトのコピーを作成します。それは理にかなっている。ところで、私はあなたの類推が本当に好きです。 – enaJ

関連する問題