何千もの補間関数を多次元配列に格納したいと思います。主な問題は、私が使用する補間関数がデフォルトのコンストラクタを持たないクラスだということです。これは多次元配列を初期化することを禁じます。私は私が行うことがしたい何デフォルトのコンストラクタを使用しないでC++、boost、多次元配列にオブジェクトを格納
:
double func(const double& x1, const double& x2, const double& x3)
{
return x1 + x2 + x3;
};
int main()
{
std::vector<double> x1 {0, 1, 2, 3};
std::vector<double> x2 {1.1, 1.2, 1.3, 1.4, 1.5};
std::vector<double> x3 {0, 10, 20, 30, 40};
std::vector<double> y(20, std::vector<double>(5));
boost::multi_array<Linear_interp, 2> Storage(boost::extents[4][5]);
typedef std::vector<double>::size_type vd_sz;
int n = 0;
for (vd_sz i_x1 = 0; i_x1 < x1.size(); ++i_x1) {
for (vd_sz i_x2 = 0; i_x2 < x2.size(); ++i_x2) {
for(vd_sz i_x3 = 0; i_x3 < x3.size(); ++i_x3) {
y[n][i_x3] = func(x1[i_x1], x2[i_x2], x3[i_x3]);
}
Linear_interp myInterp(x3, y);
Storage[i_x1][i_x2] = myInterp;
++n;
}
}
// Sample usage
double z = Storage[3][2].interp(23);
return 0;
}
問題はクラスLinear_interpにはデフォルトコンストラクタを持っていないということである(クラスがこのクラス1に似ている)、そのためには、後押し:: multi_arrayは、配列を初期化することはできません。
ループ内のすべての補間を初期化するので、これらのオブジェクトを保存する必要があります。各ループでオブジェクトが上書きされるため、オブジェクトへの単純なポインタは機能しません。
実際には、もっと多くのディメンション(atmが10個あります)があり、multi_arrayはこれを処理するのに最適なコンテナです。さらに、後のループでの補間は、以前のループから補間を取ります(つまり、再帰的な問題があります)。
EDIT 1:マイナーコード修正。
EDIT 2:コード修正:以前のバージョンでは、私は不要な結果につながる "y"を保存しませんでした。
ありがとうございます。私は多かれ少なかれC + +の新しいし、 "新しい"キーワードに精通していない。ループの中に書かれたコードと、コード内のzのようなサンプル要素にどうやってアクセスするのか、いくつかのコードを投稿できますか? – USC
@USC私は自分の答えを更新しました。 – fatherOfWine
コードを更新した後、 'printf("%f \ n "、ストレージ[0] [0] - > interp(20))を使用して値(0,1.1,20)を評価しようとすると、 私は24.5を得るが、それは21.1でなければならない。 ループ内で結果を印刷すると、正しい結果が得られるので、最後のものを持つすべての要素をループが上書きするようです。ループの後で、私は最後の補間の結果を不変にします。 – USC