我的问题如下:我已经从具有x和y值的文本文件中绘制了一个图表。图表本身是log(y / x)vs x。接下来,我定义“bin number”和“bin width”,即我想将x轴分成几个特定宽度的片段并得到所有相应的y值。现在我不停地将所有值都放在一定范围内 - 我只为每个“bin宽度”获得一个值。下面是代码的一部分(C ++ + ROOT) - 所以如果我打印vx [0],vy [0],我从文本文件中得到第一个条目,但是我想首先检查代码是否为x值在第一个bin中(从0.3到0.9),如果是,则打印所有相应的y值。然后检查x值是否在第二个bin(0.9-1.5)中,依此类推。有关如何做到这一点的任何建议都非常欢迎! :)
Float_t xmin = 0.3; //x-range starts at 0.3
Float_t xmax = 60.; //x-range ends at 60
const Int_t bins = 100; //the x range divided into 100 pieces
Float_t binW = (xmax-xmin)/(float)bins; // bin width ~0.6
Double_t xv[bins], yv[bins];
Double_t *xntuple = ntuple->GetVal(0); //1. column in txt file
Double_t *yntuple = ntuple->GetVal(1); //log(y/x)
Double_t xaxis, yaxis;
Float_t s = xmin;
for(Int_t i=0; i<bins; i++){
yaxis = yntuple[i];
yv[i] = yaxis;
xv[i] = s;
s += binW; //bin width ~0.6
}
cout << xv[0] << " and " << yv[0] << endl;
}
答案 0 :(得分:0)
我不知道您对ROOT的约束是什么,但您可以这样做:为每个bin创建向量;然后遍历所有数据并检查X值是否在当前bin的范围内。如果没有,请转到下一个垃圾箱。
这样的事情:
// Bins
std::vector<std::vector<Double_T>> vx, vy;
vx.resize(bins);
vy.resize(bins);
Float_T currentBinStart = xmin;
int currentBinNr = 0;
for (Int_T i = 0; i < numberOfValues; ++i) {
// Check if value is in range
if (xntuple[i] > currentBinStart+binWidth) {
// No => go to next bin
currentBinStart += binWidth;
currentBinNr++;
}
vx[currentBinNr].push_back(xntuple[i]);
vy[currentBinNr].push_back(yntuple[i]);
}
注意:这假设X值按升序排序!