2013-06-26 81 views
0

前提是,我不是程序員,我是物理學家,我使用C++作爲分析數據(ROOT包)的工具。我的知識可能有限!根據表分割矢量

我這種情況,我從文件中讀取數據並將其存儲在一個向量(沒有異議)

vector<double> data; 

這個數據我想繪製的相關情節,所以我需要拆分他們在兩個不同的子集中,其中一個將是2D直方圖的X條目,另一個是Y條目。

分裂必須是跟隨,我有這個表(我只複製的一小部分只是爲了說明問題)

************* LBA - LBC ************** 
-------------------------------------- 
Cell Name | Channel | PMT  | 
D0   |   0 |   1 | 
A1-L  |   1 |   2 | 
BC1-R  |   2 |   3 | 
BC1-L  |   3 |   4 | 
A1-R  |   4 |   5 | 
A2-L  |   5 |   6 | 
BC2-R  |   6 |   7 | 
BC2-L  |   7 |   8 | 
A2-R  |   8 |   9 | 
A3-L  |   9 |   10 | 
A3-R  |   10 |   11 | 
BC3-L  |   11 |   12 | 
BC3-R  |   12 |   13 | 
D1-L  |   13 |   14 | 
D1-R  |   14 |   15 | 
A4-L  |   15 |   16 | 
BC4-R  |   16 |   17 | 
BC4-L  |   17 |   18 | 
A4-R  |   18 |   19 | 
A5-L  |   19 |   20 | 
... 
None  |   31 |   32 | 

,你可以看到有像A1-LA1-R對應條目到一個單元的左側和右側,該左側和右側與int相關聯,其對應於通道,在這種情況下爲1和4.我希望這些左側和右側位於X和我的2D直方圖的Y軸。

然後問題是關聯到數據向量的某種程度上,這樣我可以選擇屬於同一個單元格的通道,並將它們分別放在X軸和Y軸上。到複雜的事情也有不具有一個夥伴像在本例中D0和不具有像信道相關聯31.


我嘗試的解決方案的小區信道單元是創建一個索引向量

vector<int> indexing = (0, 1, 4, ....); 

和有序的數據載體

vector<double> data_ordered; 

,並填寫的東西,如

有序矢量
for(vector<int> iterator it = indexing.begin(); it != indexing.end(); ++it) 
    data_ordered.push_back(data.at(*it)); 

,然後放data_ordered偶數指數在X軸和Y軸的奇數值,但我有D0單元和空的問題!

我有另一個想法是創建一個struct

struct cell{ 
    string cell_name; 
    int left_channel; 
    int right_channel; 
    double data; 
    .... 
    other informations 
}; 

,然後嘗試與合作,但說到我缺乏C++知識!有人能給我提示如何解決這個問題嗎?我希望我的問題很清楚,並且尊重這個網站的規則!

編輯----------

爲了澄清我嘗試用一​​個例子來解釋這個問題

vector<double> data = (data0, data1, data2, data3, data4, ...); 

data0具有指數0,如果我去表我看到它對應於沒有其他合作伙伴的cell D0,我們假設現在可以忽略它。data1具有索引1,它對應於cell A1A1-L)的左邊部分,因此我需要找到表中索引爲4的正確夥伴,並理想地使我從包含數據的向量中選擇data4。 我希望這至少能澄清一點情況!

+2

'PMT'與這個問題有什麼關係?在你的原始'矢量''數據'中,元素的順序與你發佈的表格有什麼關係?對於給定的字段,「Channel」是原始「矢量數據」的索引嗎?在你的* final *輸出中(不要介意中間的東西),你想用'D0'的數據做什麼?沒有顯示?你想要還是需要最終輸出的單元名稱?除了您的表由「Channel」排序的事實之外,該表的順序是否用於顯示目的?你用什麼程序來編譯,什麼版本? – Yakk

+0

將很高興看到向量中的原始數據以及它與您所擁有的表格的對應關係。 I.e是向量[0] = D001中的第一條記錄?你必須分裂他們等? – SD1990

+0

那麼,應該對那些不成對的空單元做些什麼? –

回答

1

這裏是一個引擎,你想要做什麼,大致爲:

#include <vector> 
#include <map> 
#include <string> 
#include <iostream> 

enum sub_entry { left, right, only }; 

struct DataType { 
    std::string cell; 
    sub_entry sub; 
    DataType(DataType const& o): cell(o.cell), sub(o.sub) {}; 
    DataType(const char* c, sub_entry s=only): 
    cell(c), 
    sub(s) 
    {} 
    DataType(): cell("UNUSED"), sub(only) {}; 
    // lexographic weak ordering: 
    bool operator<(DataType const& o) const { 
    if (cell != o.cell) 
     return cell < o.cell; 
    return sub < o.sub; 
    } 
}; 

typedef std::vector<double> RawData; 
typedef std::vector<DataType> LookupTable; 
typedef std::map< DataType, double > OrganizedData; 

OrganizedData organize(RawData const& raw, LookupTable const& table) 
{ 
    OrganizedData retval; 
    for(unsigned i = 0; i < raw.size() && i < table.size(); ++i) { 
    DataType d = table[i]; 
    retval[d] = raw[i]; 
    } 
    return retval; 
} 

void PrintOrganizedData(OrganizedData const& data) { 
    for (OrganizedData::const_iterator it = data.begin(); it != data.end(); ++it) { 
    std::cout << (*it).first.cell; 
    switch((*it).first.sub) { 
     case left: { 
     std::cout << "-L"; 
     } break; 
     case right: { 
     std::cout << "-R"; 
     } break; 
     case only: { 
     } break; 
    } 
    std::cout << " is " << (*it).second << "\n"; 
    } 
} 

int main() { 
    RawData test; 
    test.push_back(3.14); 
    test.push_back(2.8); 
    test.push_back(-1); 
    LookupTable table; 
    table.resize(3); 
    table[0] = DataType("A1", left); 
    table[1] = "D0"; 
    table[2] = DataType("A1", right); 
    OrganizedData org = organize(test, table); 
    PrintOrganizedData(org); 
} 

查找表存儲什麼渠道映射到什麼小區名稱和側面。

查找表中未使用的條目應設置爲DataType(),這將標記其值存儲在"UNUSED"位置。 (它仍然會被存儲,但之後可以丟棄)。

這是從(CellName, Side)double數據的地圖。我包括一個簡單的打印機,只是轉儲數據。如果你有圖形軟件,你可以找出一種方法從它製作圖表。跳過"UNUSED"是一個練習,涉及在該打印循環中檢查(*it).first.cell == "UNUSED"

我相信一切是C++ 03標準。如果你有一個C++ 11編譯器,上面的一堆變得更漂亮。

+0

好的,我看到一些我不明白的東西,比如什麼是DataType():.... {};句法? (抱歉我的無知!我正在努力學習)你能指點我嗎?非常感謝你的努力!我現在會接受答案並嘗試學習它的形式! – drkg4b

+0

@ drkg4b這是一個構造函數。 C++允許您創建類似於內置類型的類型。在這種情況下,可以使用字符串或字符串和枚舉來構造'DataType'。它支持'operator <',它可以讓我們對它進行排序並將其存儲爲'std :: map'的關鍵字。我使用'std :: map'來存儲結果,這意味着左邊/右邊的條目會相互堆砌在一起 - 並且對於那個'enum',你可能會看到「孤獨」的項目以及。 – Yakk

+0

令人驚歎!謝謝,我真的需要學習使用這些結構! – drkg4b