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 を固定します。

任意の 2 つの固定インデックスについて、残りの次元に沿ったすべてのベクトルが同じ長さであることを知っているので、私のベクトルは「通常の立方体」です。したがって、必要なすべての値の間のオフセットは同じでなければなりません。

もちろん、一時的なベクトルを作成することもできます

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:36:47.817 に答える
1

配列コンシューマ関数 gsl_spline_init() を再設計しないと、これを行うことはできません。これは、渡されたデータが連続したデータ ブロックであることに依存しています。これは、3 レベルのベクトルには当てはまりません。キューブであるだけでなく、各レベルにはヒープに割り当てられた個別のバッファーがあります。

于 2009-08-26T08:14:37.020 に答える