【问题标题】:Is it possible to combine GSL vectors into a single vector?是否可以将 GSL 向量组合成一个向量?
【发布时间】:2013-10-22 15:49:45
【问题描述】:

我正在使用 Gnu Scientific Library (GSL),我在其中初始化了不同的向量。

现在我想将这些向量组合成一个向量,以便遍历整个向量。有谁知道一种方法,在哪里可以做到这一点?

这个question 以更一般的方式讨论了同样的问题,但我想知道是否有人知道直接使用 GSL 的方法(我将使用 GSL 中实现的排序功能)。

谢谢你, 拉斯穆斯

【问题讨论】:

    标签: c++ vector gsl


    【解决方案1】:

    如果您想坚持 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 );
    }
    

    【讨论】:

      【解决方案2】:

      如果“初始化不同的向量”是指初始化不同的 std::vectors,那么您的问题的答案就在这里use std::assign

      编辑 1:在这种情况下,std::assign 是最好的答案(而不是许多地方建议的 std::copy),因为 std::copy 将一个一个地插入新元素(而不是插入整个一次数组)并且可能导致多次重新分配(意思是:当您尝试将新元素插入到其当前大小(由 std::vector::size 给出)等于其当前容量(由 std: :vector::capacity),重新分配使向量容量加倍。根据向量的大小,这可能会发生多次,这是一个非常(非常!)昂贵的操作。使用 std::assign 只会发生这种情况一次。

      如果没有(意味着你有一个 gsl_vectors 的集合),那么原则上可以将 STL 算法与 C 数组 see here 一起使用(gsl_vectors 包含一个名为 data 的 C 数组)。然而这是非常危险的,因为内存在 gsl_vectors 内的对齐方式很棘手。在这种情况下,您需要将它们手动转换为 std::vector 或手动合并为更大的 gsl_vector)

      但是,除非您需要实现矩阵或需要使用向量进行非常快速的 BLAS 操作 (see here),否则我将始终使用 std::vector(并使用 std::vector::data 将 C 指针传递给 GSL职能)。对于这两个例外,如果您想在 C++ 中工作,您应该使用 Armadillo Linear Algebra PackageBlaze(否则您需要编写一个包装器或类似 C 的代码)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-09
        • 2017-10-25
        • 1970-01-01
        • 2017-11-30
        • 2019-03-08
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        相关资源
        最近更新 更多