Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从每个箱子中获取所有y值_C++_Loops - Fatal编程技术网

C++ 从每个箱子中获取所有y值

C++ 从每个箱子中获取所有y值,c++,loops,C++,Loops,我的问题如下:我从一个文本文件中绘制了一个带有x和y值的图形。图形本身是对数(y/x)vs x。接下来,我定义“箱子编号”和“箱子宽度”,也就是说,我想将x轴划分为若干具有一定宽度的部分,并获得所有相应的y值。现在我一直在获取某个范围内的所有值——我只为每个“箱子宽度”获取一个值。下面是代码的一部分(C+++根)-因此,如果我打印vx[0],vy[0],我将从文本文件中获得第一个条目,但我希望代码首先检查x值是否在第一个箱子中(从0.3-0.9),如果是,则打印所有对应的y值。然后检查x值是否在

我的问题如下:我从一个文本文件中绘制了一个带有x和y值的图形。图形本身是对数(y/x)vs x。接下来,我定义“箱子编号”和“箱子宽度”,也就是说,我想将x轴划分为若干具有一定宽度的部分,并获得所有相应的y值。现在我一直在获取某个范围内的所有值——我只为每个“箱子宽度”获取一个值。下面是代码的一部分(C+++根)-因此,如果我打印vx[0],vy[0],我将从文本文件中获得第一个条目,但我希望代码首先检查x值是否在第一个箱子中(从0.3-0.9),如果是,则打印所有对应的y值。然后检查x值是否在第二个箱子(0.9-1.5)中,依此类推。任何关于如何做到这一点的建议都是非常受欢迎的!:)

Float\u t xmin=0.3//x范围从0.3开始
浮点数xmax=60//x波段在60度结束
const Int_t bins=100//x系列分为100件
Float_t binW=(xmax xmin)/(Float)存储箱;//料仓宽度~0.6
双_t xv[料仓]、yv[料仓];
Double_t*xntuple=ntuple->GetVal(0)//1.txt文件中的列
Double_t*yntuple=ntuple->GetVal(1)//对数(y/x)
双_t xaxis,yaxis;
浮点数=xmin;

对于(Int_t i=0;i我不知道您对ROOT的约束是什么,但您可以这样做:为每个bin生成向量;然后迭代所有数据并检查X值是否在当前bin的范围内。如果不在,则转到下一个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]);
}
//垃圾箱
std::向量vx,vy;
调整大小(箱子);
vy.调整大小(箱子);
Float_T currentBinStart=xmin;
int currentBinNr=0;
对于(Int_T i=0;icurrentBinStart+binWidth){
//否=>转到下一个垃圾箱
currentBinStart+=binWidth;
currentBinNr++;
}
vx[currentBinNr]。推回(xntuple[i]);
vy[currentBinNr]。推回(yntuple[i]);
}

注意:这假设X值是按升序排序的!

与您的问题无关,但是为什么自定义类型别名为
Float\u t
Double\u t
?实际的标准类型
Float
Double
有什么问题?有什么是ntuple?什么数据产生了错误的答案?会是什么正确答案?如果容器基于x轴,为什么只使用y轴?对于一个包含两个变量的函数,如何只有两个轴?与其将x和y值保持在单独的数组中,不如使用类似于
struct Point{double x;double y;};
并将所有的
保留在
std::vector
中。有多少点?如果不知道从何处停止,在数组中迭代会遇到真正的困难。我实现了你的代码,但它会导致分段冲突。代码现在看起来是这样的:我有相同的前四行,这是相同的:Doutable\t*xntuple=ntuple->GetVal(0);Double\t*yntuple=ntuple->GetVal(1);但除此之外,这是您发送的代码…我不知道哪里出错了:如果
currentBinNr
gets>bins,请检查check。如果是,您将访问一个不存在的bin。这表明您的数据中有错误…例如,x值>xmin+bins*binWidth。此外,请检查
numberOfValues
是否正确。通常,请使用调试器并查看发生了什么
// 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]);
}