2016-10-26 4 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라고 말합니다. 예, 스택 공간은 제한되어 있지만 일반적으로 일부 경계 내에서 변경할 수 있습니다. 또한 배열의 항목이 1MB를 차지하는 경우 배열에 1023 개를 배치 할 가능성은 없으며 항목에 단일 바이트가있는 경우 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! 매크로 후드 1에서 무엇을하는지에 가까운 :

간단한 주위 작품은 루프를 사용하는 것입니다.

그렇지 않으면 사용자 지정 형식으로 배열을 래핑하고 Clone (및 Index)을 구현할 수 있습니다. 또한 가능성이 있습니다.


1vec![T; N]

조금 똑똑 메모리 보장에만 다중 할당을 갖는 것보다 오히려 한번 할당된다. 그러나 라이브러리에 대한 인상적인 성능 향상을 위해 많은 기여를 한 @bluss에 따르면 collect은 곧 가장 일반적인 반복기에도 단일 할당을 수행 할 수있을만큼 현명해야합니다.

+0

@Shepmaster : 나는이 기능적인 스타일에 익숙해 져야한다. ... –

+0

*'vec!'매크로가 두포에서 무엇을하는지 * -별로는, 실제로는 그보다 약간 더 효율적이다. (https :// /github.com/rust-lang/rust/blob/91f34c0c70746f5c938d25d02a8a66b41240b2f0/src/libcollections/macros.rs#L45-L53). – Shepmaster

+0

@Shepmaster : 어떻게? 루프를 사용하는 ['extend_with_element'] (https://doc.rust-lang.org/src/collections/up/src/libcollections/vec.rs.html#1045)를 호출하는'from_elem'을 호출합니다. 어딘가에 전문화가 있습니까? –

관련 문제