2013-10-22 1 views
0

다른 벡터를 초기화 한 GSL (Gnu Scientific Library)을 사용하고 있습니다.GSL 벡터를 단일 벡터에 결합 할 수 있습니까?

이제 전체 벡터를 반복하기 위해이 벡터들을 단일 벡터로 결합하고 싶습니다. 아무도 방법을 알 수 있습니까? 어디에서 가능합니까?

question은 좀 더 일반적인 방식으로 같은 문제를 논의하지만, 누군가가 GSL을 사용하여이를 직접 수행하는 방법을 알고 있는지 알고 싶습니다. (나중에 GSL에서 구현 된 정렬 함수를 사용하고 있습니다.)

, 감사에 의한 경우 라스무스

답변

0

당신은 당신의 질문의 대답은 use std::assign는 여기에, 초기화 된 다른 표준 : : 벡터를 의미 "다른 벡터를 초기화".

EDIT 1 : std :: copy가 새로운 요소를 하나씩 삽입하기 때문에 std :: assign이 가장 좋은 대답입니다 (많은 곳 에서처럼 std :: copy가 아닙니다). (즉, 전체 배열을 한 번에) 여러 재 할당을 할 수 있습니다. 즉, 현재 요소의 크기 (std :: vector :: size로 지정)가 현재 용량과 동일한 벡터에 새 요소를 삽입하려고하면 :: vector :: capacity)를 사용하면 벡터 용량을 두 배로 재 할당 할 수 있습니다. 벡터 크기에 따라 여러 번 발생할 수 있으며 매우 비싼 작업입니다.

그렇지 않으면 (gsl_vectors 컬렉션이 있음을 의미), 원칙적으로 C와 함께 STL 알고리즘을 사용할 수 있습니다 배열 see here (gsl_vectors에는 data라는 C 배열이 있습니다). 그러나 메모리가 gsl_vectors 내부에서 정렬되는 방식이 까다 롭기 때문에 매우 위험합니다. 이 경우 수동으로 std :: vector로 변환하거나 수동으로 더 큰 gsl_vector로 병합해야합니다.

그러나 매트릭스를 구현해야하거나 벡터 (see here)로 매우 빠른 BLAS 연산이 필요한 경우가 아니라면 항상 std :: vector (그리고 std :: vector :: data를 사용하여 C 포인터를 GSL 함수로 전달). 이 두 가지 경우를 제외하고 C++로 작업하려면 Armadillo Linear Algebra Package 또는 Blaze을 사용해야합니다 (그렇지 않으면 C와 같은 래퍼 또는 코드를 작성해야합니다).

0

GSL을 고수하고 모든 벡터 좌표를 개별적으로 설정하지 않으려면 gsl_vector_subvector에서 얻은 gsl_vector_view을 사용할 수 있습니다.

이 목적을 위해 출력 벡터 gsl_vector를 모든 다른 벡터의 연결을 유지할만큼 충분히 할당하십시오. 그런 다음 이들 각각에 대해 gsl_vector_subvector을 사용하여 출력 벡터 부분에 대한 gsl_vector_view를 얻습니다. 그 다음 해당 입력 부분에 대한 각 입력 벡터로부터 gsl_vector_memcpy 수 있습니다. gsl_vector_view는 vector이라는 gsl_vector를 포함하는 구조체입니다.

#include <stdio.h> 
#include <gsl/gsl_vector.h> 

#define length1 4 
#define length2 6 

int main() { 
    /* allocate all vectors */ 
    gsl_vector 
     *vectorIn1 = gsl_vector_alloc(length1), 
     *vectorIn2 = gsl_vector_alloc(length2), 
     *vectorOut = gsl_vector_alloc(length1+length2); 

    /* fill input vectors with some test data */ 
    for (size_t index = 0; index < length1; ++index) { 
     gsl_vector_set(vectorIn1, index, -(double)index); 
    } 
    for (size_t index = 0; index < length2; ++index) { 
     gsl_vector_set(vectorIn2, index, (double)index); 
    } 

    /* perform the copy to portions of the output */ 
    { 
     gsl_vector_view 
      viewOut1 = gsl_vector_subvector(vectorOut, 0, length1), 
      viewOut2 = gsl_vector_subvector(vectorOut, length1, length2); 
     gsl_vector_memcpy(&viewOut1.vector, vectorIn1); 
     gsl_vector_memcpy(&viewOut2.vector, vectorIn2); 
    } 

    /* display the result to see it is correct */ 
    for (size_t index = 0; index < length1 + length2; ++index) { 
     printf("%3.1f\n", gsl_vector_get(vectorOut, index)); 
    } 

    /* be nice and tidy: release resources after use */ 
    gsl_vector_free(vectorOut); 
    gsl_vector_free(vectorIn2); 
    gsl_vector_free(vectorIn1); 
} 
관련 문제