gpt4 book ai didi

c++ - 根据表格拆分 vector

转载 作者:行者123 更新时间:2023-11-28 07:32:53 26 4
gpt4 key购买 nike

前提是,我不是程序员,我是物理学家,我使用c++作为分析数据的工具(ROOT包)。我的知识可能有限!

我有这种情况,我从一个文件中读取数据并将它们存储在一个 vector 中(没问题)

vector<double> data;

我想利用这些数据绘制相关图,因此我需要将它们分成两个不同的子集,其中一个是二维直方图的 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 对应于 channel,在本例中为 1 和 4。我希望这些左侧和右侧位于 X和我的二维直方图的 Y 轴。

然后问题是以某种方式将此表关联到数据 vector ,以便我可以选择属于同一单元格的 channel ,并将它们一个放在 X 轴上,另一个放在 Y 轴上。使事情复杂化的还有像本例 D0 中那样没有合作伙伴的单元格和没有关联单元格的 channel ,如 channel 31。


我尝试的解决方案是创建一个索引 vector

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

和一个有序的数据 vector

vector<double> data_ordered;

并用类似的东西填充有序 vector

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, ...);

do data0 的索引为 0,如果我转到表格,我会看到它对应于没有其他合作伙伴的 cell D0,假设现在可以忽略. data1 的索引为 1,它对应于 cell A1 的左侧部分(A1-L),因此我需要找到合适的合作伙伴在表中有索引 4,理想情况下会引导我从包含数据的 vector 中选择 data4。我希望这至少能澄清一点!

最佳答案

这是一个可以做你想做的事情的引擎,大致是:

#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 );
}

查找表存储什么 channel 映射到什么单元名称和面。

查找表中未使用的条目应设置为 DataType(),这会将它们的值标记为存储在 “UNUSED” 位置。 (它仍将被存储,但您可以在之后丢弃它)。

结果是从 (CellName, Side)double 数据的映射。我包括了一个简单的打印机,它只是转储数据。如果你有绘图软件,你可以想出一种方法来制作图表。跳过 "UNUSED" 是一项涉及在打印循环中检查 (*i​​t).first.cell == "UNUSED" 的练习。

我相信一切都符合 C++03 标准。如果你有一个 C++11 编译器,上面的一堆会变得更漂亮。

关于c++ - 根据表格拆分 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17321633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com