2013-10-22 40 views
0

我正在使用Gnu科學圖書館(GSL),在那裏我初始化了不同的向量。是否可以將GSL向量組合成單個向量?

現在我想將這些向量組合成一個向量,以遍歷整個向量。有沒有人知道一種方法,哪裏可以做到這一點?

question以更一般的方式討論了同樣的問題,但我想知道是否有人知道直接使用GSL(我將使用GSL中實現的排序功能)的方法。

謝謝 拉斯穆斯

回答

0

如果「初始化不同的載體」你的意思是初始化不同的std ::載體,那麼你的問題的答案就在這裏use std::assign。編輯1:在這種情況下,std :: assign是最好的答案(而不是std :: copy,因爲許多地方會建議),因爲std :: copy會逐個插入新元素(而不是插入整個數組一次),並可能導致多次重新分配(意思是:當您嘗試插入一個新的元素到一個向量,其當前大小(由std :: vector :: size給出)等於它的當前容量(由std給出:: vector :: capacity),重新分配會使向量容量增加一倍。根據向量的大小,這可能會發生多次,這是一個非常(非常)昂貴的操作。發生一次

如果不是(意思是你有一個gsl_vectors的集合),那麼原則上可以使用STL算法和C數組see here(gsl_vectors包含一個稱爲數據的C數組)。然而,這是非常危險的,因爲內存在gsl_vectors內部對齊的方式很棘手。在這種情況下,你需要將它們手動轉換爲std ::向量或然後手動合併到一個更大的gsl_vector)

但是,除非你需要實現矩陣或需要非常快的BLAS操作與載體(see here)我總是使用std :: vector(並使用std :: vector :: data將C指針傳遞給GSL函數)。對於這兩個例外,如果你想用C++工作,你應該使用Armadillo Linear Algebra PackageBlaze(否則你需要編寫一個類似C的包裝器或代碼)。

0

如果你想堅持GSL,但沒有單獨設置所有的矢量座標,你可以使用gsl_vector_subvector獲得的gsl_vector_view

爲此,分配足夠大的輸出gsl_vector來保存所有不同向量的連接。然後,對於其中的每一個,使用gsl_vector_subvector來獲取輸出向量部分的gsl_vector_view。然後,您可以將每個輸入向量gsl_vector_memcpy分配給相應的部分。請注意,gsl_vector_view是包含gsl_vector的結構,其名稱爲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); 
} 
相關問題