我在C ++中有一个向量载体,定义为:vector < vector<double> > A;
让我们假设A已经填充了一些值。有没有一种快速的方法可以从A中提取行向量?
例如,A[0]
会给我第一列矢量,但是如何快速得到第一行矢量?
答案 0 :(得分:2)
该数据结构没有“快速”方法,您必须迭代每个列向量并获取所需行的值,然后将其添加到临时行向量中。这是否足够快取决于您的需求。为了使其尽可能快,请确保在目标行向量中分配适当的空间,因此在向其添加值时无需调整大小。
解决性能问题的简单方法是使用一些现有的矩阵库,例如注释中建议的Eigen。
如果您需要自己执行此操作(由于是赋值,或者由于许可问题或其他原因),则可能应该创建自己的“ Matrix 2D”类,并在其中隐藏实现细节。然后,根据您的实际需求,可以采用以下技巧:
但是它需要重复:某人已经为您完成了此操作,因此,如果可以的话,请尝试使用现有的库...
答案 1 :(得分:1)
没有真正快速的方法来做到这一点。 还要指出,我要说的是相反的约定,这意味着但是,即使 trying < / em>获取列并不是一件容易的事,因为A[0]
实际上是第一行,而不是第一列。
{0, 1, 2, 3, 4}
{0}
{0, 1, 2}
是很有可能的vector<vector<double>> A
,但没有实际的列1
,2
,3
或4
。如果您希望强制执行相同长度的列之类的行为,则创建一个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/
中您将永远无法击败这些高度优化的库。