对结构 C 中的数据使用 GSL 库函数

Using GSL lib functions on data in a struct C

许多 GSl 函数将参数作为双精度或双精度数组。但是,我的大部分数据都嵌套在结构数组中。比如说数组:

struct A
{
  double a;
  int b;
};

我可以编写一个包装器,将数据复制到纯双精度或整数数组中。但我对解决这个问题的更优雅的东西很感兴趣。

不是你想要的答案。但是由于你不能改变 GSL 接口,如果你正在寻找性能,我认为你最好的解决方案可能是从一开始就选择与工作相匹配的数据结构。所以也许类似于包含双精度数组的结构。

如果 GSL 接口和原始数据结构都不在您的控制范围内,那么您唯一的选择可能就是您正在考虑的包装器。

如果您正在使用的库函数可以使用 'stride' 参数,您可以查看结构打包和填充。 (但这仍然不会将您的整数转换为双精度数。)

"...much of my data is nested in arrays of structs instead. ... I could write a wrapper that copies the data into an array of pure doubles or ints. But I was interested in something more elegant to get around this."

无需编写包装器将数据复制到纯 doubleint 的数组中。事实上,你有一个 array-of-struct 已经提供了对每个存储值的方便的直接访问。使用 array-of-struct 访问数组中的每个个体 struct 是索引所需结构的简单问题,例如array[n] 其中 n 是数组中需要的元素。

在您的示例中,array[n].a 提供对成员 adouble 值的直接访问,array[n].b 提供对 int 成员 b 用于数组中的每个有效索引。

直接访问数组中每个结构的每个成员的此索引的简短示例可能会有所帮助。下面用五个结构初始化 array,显示 doubleint 值。然后在输出每个结构的每个成员之前,int 值在循环内递增 1,例如

#include <stdio.h>

typedef struct A {  /* struct A (with a typedef for convenience) */
    double a;
    int b;
} A;

int main (void) {

    /* array of struct A */
    A array[] = {{1.1, 1}, {2.2, 2}, {3.3, 3}, {4.4, 4}, {5.5, 5}};
    size_t nelem = sizeof array / sizeof *array;    /* no. elements */

    for (size_t i = 0; i < nelem; i++) { 
        array[i].b++;   /* increment int/output stored values */
        printf ("array[%zu]: {%3.1f, %d}\n", i, array[i].a, array[i].b);
    }
}

示例Use/Output

请注意 array-of-struct 中每个 struc 中存储的整数值如何在每个 [=] 中的值之前递增 1 14=] 与数组直接用作 printf:

输出的参数
$ ./bin/arraystruct
array[0]: {1.1, 2}
array[1]: {2.2, 3}
array[2]: {3.3, 4}
array[3]: {4.4, 5}
array[4]: {5.5, 6}

无论您想如何使用,您对每个成员的访问权限都是一样的。查看所有内容,如果您还有其他问题,请告诉我。