我正在使用Gnu科學圖書館(GSL),在那裏我初始化了不同的向量。是否可以將GSL向量組合成單個向量?
現在我想將這些向量組合成一個向量,以遍歷整個向量。有沒有人知道一種方法,哪裏可以做到這一點?
question以更一般的方式討論了同樣的問題,但我想知道是否有人知道直接使用GSL(我將使用GSL中實現的排序功能)的方法。
謝謝 拉斯穆斯
我正在使用Gnu科學圖書館(GSL),在那裏我初始化了不同的向量。是否可以將GSL向量組合成單個向量?
現在我想將這些向量組合成一個向量,以遍歷整個向量。有沒有人知道一種方法,哪裏可以做到這一點?
question以更一般的方式討論了同樣的問題,但我想知道是否有人知道直接使用GSL(我將使用GSL中實現的排序功能)的方法。
謝謝 拉斯穆斯
如果「初始化不同的載體」你的意思是初始化不同的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 Package或Blaze(否則你需要編寫一個類似C的包裝器或代碼)。
如果你想堅持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);
}