转置2d向量/矩阵

时间:2012-04-30 15:26:20

标签: c++

我有以下2d矢量/矩阵X和矢量Y,如下所示:

std::vector<double> Y; 
unsigned int ctr=2;
std::vector<std::vector<double> >X(ctr,Y);

我现在想创建一个X的转置,即。 Xtrans,所以我将其声明如下

std::vector<std::vector<double> >Xtrans(Y,ctr);

但是它给了我以下编译错误:

test.cpp:128:58: error: no matching function for call to ‘std::vector<std::vector<double> >::vector(std::vector<double>&, unsigned int&)’
/usr/include/c++/4.5/bits/stl_vector.h:241:7: note: candidates are: std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >, std::vector<_Tp, _Alloc> = std::vector<std::vector<double> >]
/usr/include/c++/4.5/bits/stl_vector.h:227:7: note:                 std::vector<_Tp, _Alloc>::vector(std::vector::size_type, const value_type&, const allocator_type&) [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >, std::vector::size_type = unsigned int, value_type = std::vector<double>, allocator_type = std::allocator<std::vector<double> >]
/usr/include/c++/4.5/bits/stl_vector.h:215:7: note:                 std::vector<_Tp, _Alloc>::vector(const allocator_type&) [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >, allocator_type = std::allocator<std::vector<double> >]
/usr/include/c++/4.5/bits/stl_vector.h:207:7: note:                 std::vector<_Tp, _Alloc>::vector() [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >]

如何正确宣布Xtrans?

4 个答案:

答案 0 :(得分:2)

除了其他人已经说过的关于修复代码的内容之外,我还想评论使用vector<vector<double> >作为矩阵表示,效率非常低,而且几乎不是你想要的。我的一个同事曾经使用这种风格继承了一个代码。使用适当的索引调整函数将其转换为简单vector<double>会使性能提高 30 。抵制诱惑。

您可能想要查看C ++的许多可用矩阵库之一(例如eigenuBlasmtl4等等;还有很多其他的。)

答案 1 :(得分:1)

我认为这里有两个问题 - 首先是你可能误解了std::vector是如何构建的,以及当你做

时这个事实
std::vector<std::vector<double> >Xtrans(Y,ctr); 

它正在生成编译器错误,因为没有与您的声明匹配的构造函数。

std::vector的一个构造函数(即用于声明X的构造函数)的声明如下:

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

所以当你完成(ctr, Y)时,你做的很好 - 因为你告诉编译器你要创建std::vector大小为ctr的{​​{1}}的{​​{1}}是的。 (在您的情况下,Y为空Y - 因此您获得了std::vector<double>条目的向量,其中每个条目都为空ctr

因此,简单地交换std::vector<double>ctr,希望您获得转置的Y在这里不起作用。

第二个问题是你如何实际转换价值观。实际上,您需要找出一个执行X转置的算法,然后将这些值推送到Xtrans。转置值与实际构造向量不同。最有可能的是,您的算法类似于 - 构造std::vector,然后迭代'X XTrans XTrans`。

答案 2 :(得分:0)

为了使代码编译,你可以按如下方式声明Xtrans

std::vector<double> Y;
unsigned int ctr=2;
std::vector<std::vector<double> >X(ctr,Y);
std::vector<double> ctr_vector(2);
std::vector<std::vector<double> >Xtrans(Y.size(),ctr_vector);

但是,您必须填充Xtrans才能将其用作X的转置版本

答案 3 :(得分:0)

您似乎误解了std::vector的构造函数语法。 Check here for more info

调用std::vector<std::vector<double> >X(ctr,Y)会产生ctr YX个副本并将其存储到X中。所以从根本上说,X仍然是一维对象,只是在std::vector的每个索引处,您都会获得另一个Ystd::vector<std::vector<double> >Xtrans(Y,ctr)的副本。

因此,您的后续语法std::vector与类型{{1}}的任何构造函数都不匹配。您不像在NumPy或Matlab中那样构建二维数组。

您也可以查看this link。对你来说最好的事情就是编写自己的转置函数,手动将条目放入循环中的新数组中。