2017-06-16 63 views
0

我的問題如下:我從一個帶有x和y值的文本文件繪製了一個圖。圖本身是log(y/x)vs x。接下來,我定義了「bin number」和「bin width」,即我想將x軸分成幾個確定的寬度並獲得所有相應的y值。現在我被困在獲得一定範圍內的所有值 - 我只爲每個「容器寬度」獲得一個值。下面是一段代碼(C++ + ROOT) - 所以如果我打印vx [0],vy [0],我從文本文件中得到第一個條目,但我希望代碼首先檢查x值是在第一個bin(從0.3-0.9),如果是,打印所有相應的y值。然後檢查x值是否在第二個倉中(0.9-1.5)等等。任何建議如何做到這一點非常歡迎! :)獲取每個垃圾箱的所有y值

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

與您的問題和問題無關,但爲什麼自定義類型是別名「Float_t」和「Double_t」?實際的標準類型「float」和「double」有什麼問題? –

+1

什麼是ntuple?哪些數據會產生不正確的答案?什麼纔是正確的答案?如果箱子是基於X軸的,爲什麼只使用Y軸?你怎麼只有兩個軸的函數,它需要兩個變量? –

+2

不應將X和Y值保存在單獨的數組中,而應該像'struct Point {double x; double y; };'並將所有'Point'保存在'std :: vector '中。 –

回答

0

我不知道你的約束與ROOT什麼,但你可以做這樣的事情:爲每個倉載體;然後遍歷所有數據並檢查X值是否在當前分檔的範圍內。如果不是,請轉到下一個垃圾箱。

事情是這樣的:

// 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值是按升序排序!

+0

我實現了你的一段代碼,但它給了我分段違規。代碼看起來像這樣:我有相同的前四行,這是相同的: Double_t * xntuple = ntuple-> GetVal(0); Double_t * yntuple = ntuple-> GetVal(1); ,但否則它的代碼您發送...我不知道有什麼問題:S – justme

+0

檢查'currentBinNr'獲取>箱。如果是這樣,你將訪問一個不存在的bin。這表明您的數據存在錯誤...例如x值> xmin + bin * binWidth。另外,檢查'numberOfValues'是否正確。一般來說,使用調試器,看看會發生什麼 –

+0

我犯了一個錯誤。它必須讀'vx.resize(bin)'...修正它 –