0

我有一个 std::vector,即

vector<vector<vector> > > mdata;

我想将数据从我的 mdata 向量传递到 GSL 函数

gsl_spline_init(gsl_spline * spline, const double xa[], const double ya[], size_t size);

作为你。我已经发现我可以做类似的事情

gsl_spline_init(spline, &(mgrid.front()), &(mdata[i][j][k].front()), mgrid.size());

如果我想将固定 i,j 的数据从 mdata 传递到 gsl_spline_init(),这很好。

但是,现在我需要传递 mdata 的第一个维度,因此对于固定的 j,k。

我知道对于任何两个固定索引,其余维度上的所有向量都具有相同的长度,因此我的向量是“常规立方体”。所以我需要的所有值之间的偏移量应该是相同的。

当然我可以创建一个临时向量

int j = 123;
int k = 321;
vector<double> tmp;
for (int i = 0: i < mdata.size(); i++)
    tmp.push_back(mdata[i][j][k]);
gsl_spline_init(spline, &(mgrid.front()), &(tmp.front()), mgrid.size());

但这似乎太复杂了。也许有一种方法可以通过指针算术来实现我的目标?

任何帮助是极大的赞赏 :)

4

2 回答 2

1

如果不重新设计数组使用者函数 gsl_spline_init(),你真的无法做到这一点——它依赖于传递的数据是一个连续的数据块。这不是你的三级向量的情况 - 它不仅是一个立方体,而且每个级别都有一个在堆上分配的单独缓冲区。

于 2009-08-26T08:14:37.020 回答
1

这是做不到的。不仅是向量,即使是普通数组,也只有最后一个维度是连续的数据块。如果gsl_spline_init采用迭代器而不是数组,您可以尝试制作一些仿函数来选择合适的数据,但我不确定是否值得尝试。没有指针算术可以帮助你。

于 2009-08-26T08:36:47.817 回答