我想在C ++中评估一个函数,但我只在表中定义了这些值,如下所示:
entry # en(eV) Effective Qm - Defined in introduction(1E-16*cm^2)
1 0 4.96
2 0.001 4.98
3 0.002 5.02
4 0.003 5.07
5 0.005 5.12
6 0.007 5.15
7 0.0085 5.18
我想要一个函数,它返回每个能量的有效Qm。理想情况下是内插值,但是现在我很乐意将四舍五入到已知Qm的最接近的能量并将其作为结果。我不知道应该怎么做。我知道在Mathematica中这很容易,但其余的代码在C ++中要快得多。
答案 0 :(得分:1)
假设您为数据创建了一个结构:
struct energyEntry {
double energy;
double Qm;
};
我假设您可以将数据加载到矢量中。您正在寻求帮助的第一级方法只是加载数据并找到最近的条目。您只需跟踪最近的条目,并在迭代数据时更新该条目。最后,您将获得最接近的项目。
std::vector<energyEntry> entries;
loadEntries(entries); // assuming you can do this
double targetEnergy = 0.0015; // value you want to look up
int best = 0;
for (int x = 1; x < entries.size(); x++)
{
if (fabs(entries[x].energy-targetEnergy) < fabs(entries[best].energy-targetEnergy))
best = x;
}
cout << "Qm is " << entries[best].Qm << "\n";
这里有一些警告。确保通过引用将向量传递给loadEntries
。如果精度很重要,您可能需要进行浮点比较。您可能希望在函数中使用此代码。但是,这会让你开始。
如果您想要做更多事情,可以进行回归以尝试对数据建模(线性,逻辑或神经网络)。或者,如果你介于两点之间,你可以插值。但这是一个单独的问题。
答案 1 :(得分:0)
Nathan S作为回答实现了手动线性搜索。在C ++中已经有了更好的解决方案。假设设置相同:
struct energyEntry {
double energy;
double Qm;
};
std::vector<energyEntry> entries = loadEntries();
double targetEnergy = 0.0015; // value you want to look up
这是在C ++中正确完成的方式:
auto iter = upper_bound(begin(entries), end(entries), targetEnergy,
[](energyEntry ee, double target) { return ee.energy < target; });
if (iter != end(entries)) {
// *iter is bigger than target
if (iter != begin(entries)) {
// iter-1 exists, and it was smaller or equal.
} else {
// Target is smaller than smallest value in table
}
} else {
// Value is bigger than largest value in table
}
由你决定如何处理这三种情况。