在C 中获取2D向量的行

Get row vector of 2d vector in C++

本文关键字:向量 2D 获取      更新时间:2023-10-16

我在C 中有一个向量为:vector < vector<double> > A;

让我们假设a已填充了一些值。是否有一种快速的方法从?

提取行矢量

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

使用该数据结构没有"快速"的方式,您必须迭代每个列向量并获取所需行的值并将其添加到临时行矢量中。这对您来说足够快还是不取决于您的需求。为了使其尽可能快地,请确保在目标行向量中分配适量的空间,因此在将值添加到其时不需要调整大小。

对性能问题的简单解决方案是使用一些现有的矩阵库,例如评论中建议的eigen。

如果您需要自己执行此操作(因为它是任务,或者是由于许可问题或其他任何内容),则可能应该创建自己的"矩阵2D"类,并隐藏在其中的实现详细信息。然后根据您的确切需要,您可以采用诸如:

之类的技巧
  • 对行有一个"缓存",因此,如果获取了多次相同行,则可以从缓存中获取,并且不需要创建新的向量
  • 将数据存储为行向量的向量,也存储了列向量的向量,因此您可以在恒定时间内获取行或列,以使用更多的内存和使更改的昂贵两倍,因为数据的重复
  • 根据当前需求动态更改内部表示形式,因此您可以获得固定的内存使用情况,但是当您需要更改内部表示形式时,需要支付处理成本
  • 将数据存储在具有行大小*列的平面矢量中,并从行和列中计算自己的代码中的正确偏移

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

没有真正快速的方法可以做到这一点。也指出,我要说的是相反的方式,这意味着A[0]实际上是第一行,而不是第一行。获得一列并不是很简单,因为

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

是一个非常可能的vector<vector<double>> A,但是没有真正的1234。如果您希望像相同的长度列执行行为,那么创建Matrix类可能是个好主意(或使用库)。

您可以编写一个函数,该函数可以通过在行上迭代,以存储适当的列值来返回vector<double>。但是,您必须谨慎时要复制还是指向矩阵值(vector<double>/vector<double *>)。这不是很快,因为这些值在内存中并不彼此相邻。

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

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

例如,在您的情况下:完全由您调用[0] a列或"行"。您只需要始终如一地执行操作(最好定义一个围绕的小界面,从而显式)。但是停止,不要那样做:

这将使您进入一个新的级别:对于多维数据,您通常不使用向量>(但这是另一个问题)。查看已经存在的智能和高效解决方案,例如在ublas https://www.boost.org/doc/libs/1_65_1/libs/numeric/bublas/bublas/doc/index.html或eigen3 https://eigen.tuxfamily.or.or.orgg/dox/dox/

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