2016-10-26 13 views
0

大きな正方形配列を作成したいが、次元の制限は1023です。したがって、in a commentのように、1D配列のVecを作成します。 VMAXの任意の値の罰金です大きな2D行列の作成方法

fn main() { 
    const VMAX: usize = 1000; 
    const ALEN: usize = 32; 
    let mut arr2: Vec<[f64; ALEN]> = vec![[0.0; ALEN]; VMAX];} 

が、32より大きいALENが与える:

error[E0277]: the trait bound `[f64; 33]: std::clone::Clone` is not satisfied 
--> <std macros>:2:1 
    | 
2 | $ crate :: vec :: from_elem ($ elem , $ n)) ; ($ ($ x : expr) , *) => (
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
tes3.rs:4:35: 4:58 note: in this expansion of vec! (defined in <std macros>) 
    | 
    = help: the following implementations were found: 
    = help: <[T; 0] as std::clone::Clone> 
    = help: <[T; 1] as std::clone::Clone> 
    = help: <[T; 2] as std::clone::Clone> 
    = help: <[T; 3] as std::clone::Clone> 
    = help: and 29 others 
    = note: required by `std::vec::from_elem` 

何かが間違って起こっていると私は問題は情報の検索と解釈している私は、スタートとしてこれを試してみましたエラーメッセージ。私の巨大な正方形の行列を作るにはどうすればいいですか?別のアプローチも良いでしょう。パフォーマンスは重要です。もちろん、私はインデックスをループし、その中にいくつかの値を入れるなど、配列を使って何かを行います。

+1

※寸法限界は1023です - いいえ、ありません。それはあなたのコンピュータが持っているすべてのものなので、「メモリの限界」は4GBだと言っているようです。はい、スタックスペースは限られていますが、通常はある範囲内で変更できます。さらに、配列内の項目が1 MBを取る場合は、配列内に1023を配置する可能性は低く、項目が1バイトの場合は、おそらく1023以上を配置できます。 – Shepmaster

+0

重複したhttp:// stackoverflow。 com/q/25151890/155423またはhttp://stackoverflow.com/q/13102786/155423またはhttp://stackoverflow.com/q/28145732/155423またはhttp://stackoverflow.com/q/39240360/155423を参照してください。 **質問をする前に検索をして、回答者の時間を尊重してください**。発生しているエラーは、おそらくhttp://stackoverflow.com/q/30415354/155423で説明されています。 – Shepmaster

+1

さらに、数値計算と科学計算を扱う[いくつかの木枠](https://crates.io/)があります。これらの木箱の作者は、すでにこれらの決定に十分な考えを持っています。私が知っているものは[ndarray](https://github.com/bluss/rust-ndarray)です。 – Shepmaster

答えて

2

あなたは錆はまだ非タイプの一般的なパラメータをサポートしていない問題をヒットしているので、[T; N]上の特徴は、唯一32(包括的)に0からNの値のために実装されています。はい、それは迷惑です。

単純な回避策は、ループを使用することである。

let v: Vec<_> = (0..MAX).map(|_| [0.; MAX]).collect(); 

vec!マクロフード下で何の近くに位置していました。

それ以外の場合は、カスタムタイプで配列をラップし、Clone(およびIndex)を実装することができます。それは可能性もあります。


vec![T; N]ビット賢くとメモリだけではなく、複数の割り当てを有するよりも、一度に割り当てられていることを確認しますです。しかし、ライブラリに対する質の高いパフォーマンス向上のために貢献してくれた@bluss氏によれば、すぐにほとんどの一般的なイテレータに対して1つの割り当てを行うには、スマートになるはずです。

+0

@Shepmaster:私は本当にこの機能的なスタイルに慣れる必要があります... –

+0

* 'vec!'マクロはフードの下で何をしますか? - それほど実際にはそれよりも効率的です(https:///github.com/rust-lang/rust/blob/91f34c0c70746f5c938d25d02a8a66b41240b2f0/src/libcollections/macros.rs#L45-L53)。 – Shepmaster

+0

@シェマーマスター:どのように? 'from_elem'を呼び出すと、ループを使用する[' extend_with_element'](https://doc.rust-lang.org/src/collections/up/src/libcollections/vec.rs.html#1045)が呼び出されます。どこか専門分野はありますか? –

関連する問題