在C ++中获取2d向量的行向量

时间:2019-03-07 12:49:15

标签: c++ vector

我在C ++中有一个向量载体,定义为:vector < vector<double> > A;

让我们假设A已经填充了一些值。有没有一种快速的方法可以从A中提取行向量?

例如,A[0]会给我第一列矢量,但是如何快速得到第一行矢量?

3 个答案:

答案 0 :(得分:2)

该数据结构没有“快速”方法,您必须迭代每个列向量并获取所需行的值,然后将其添加到临时行向量中。这是否足够快取决于您的需求。为了使其尽可能快,请确保在目标行向量中分配适当的空间,因此在向其添加值时无需调整大小。

解决性能问题的简单方法是使用一些现有的矩阵库,例如注释中建议的Eigen。

如果您需要自己执行此操作(由于是赋值,或者由于许可问题或其他原因),则可能应该创建自己的“ Matrix 2D”类,并在其中隐藏实现细节。然后,根据您的实际需求,可以采用以下技巧:

  • 具有用于行的“缓存”,因此,如果多次提取同一行,则可以从缓存中提取该行,而无需创建新的向量
  • 将数据既存储为行向量又存储为列向量,因此您可以在固定时间获取行或列,但要消耗更多的内存,并且由于数据重复而使更改的成本增加一倍 li>
  • 根据当前需求动态更改内部表示,因此可以获得固定的内存使用量,但是在需要更改内部表示时需要支付处理费用
  • 将数据存储在具有行*列大小的平面向量中,并在您自己的代码中计算行和列的正确偏移量

但是它需要重复:某人已经为您完成了此操作,因此,如果可以的话,请尝试使用现有的库...

答案 1 :(得分:1)

没有真正快速的方法来做到这一点。 还要指出,我要说的是相反的约定,这意味着A[0]实际上是第一行,而不是第一列。但是,即使 trying < / em>获取列并不是一件容易的事,因为

{0, 1, 2, 3, 4}
{0}
{0, 1, 2}

是很有可能的vector<vector<double>> A,但没有实际的列1234。如果您希望强制执行相同长度的列之类的行为,则创建一个Matrix类可能是一个好主意(或使用库)。

您可以编写一个函数,该函数将通过遍历行并存储适当的列值来返回vector<double>。但是,对于要复制还是指向矩阵值(vector<double> / vector<double *>),您必须要小心。这不是很快,因为内存中的值并不相邻。

答案 2 :(得分:0)

答案是:在您的情况下,没有对应于列的简单选项。原因之一是vector>是多维数据的特别不适合的容器。

在多维方面,这是重要的设计决策之一:您要最有效地访问哪个维度,并可以根据答案定义容器(可能非常专业和复杂)。

例如,在您的情况下:完全取决于您将A [0]称为“列”还是“行”。您只需要一致地执行此操作即可(最好定义一个小接口,使该接口清晰可见)。但是停止,不要那样做:

这将带您进入下一个层次:对于多维数据,通常不使用vector>(但这是一个不同的问题)。查看现有的智能高效解决方案,例如在ublas https://www.boost.org/doc/libs/1_65_1/libs/numeric/ublas/doc/index.html或eigen3 https://eigen.tuxfamily.org/dox/

您将永远无法击败这些高度优化的库。