繁体   English   中英

仅由表定义的评估函数,C ++

[英]evaluating function only defined by table, C++

我想用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 ++中要快得多。

假设您为数据创建一个结构:

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 如果精度很重要,则可能需要进行浮点比较。 您可能需要在函数中使用此代码。 但是,这可以帮助您入门。

如果您想做更多事情,可以进行回归以尝试对数据建模(线性,逻辑或神经网络)。 或者,如果您介于两点之间,则可以进行插值。 但这是一个单独的问题。

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
 }

如何处理这三种情况完全取决于您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM