我有以下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?
答案 0 :(得分:2)
除了其他人已经说过的关于修复代码的内容之外,我还想评论使用vector<vector<double> >
作为矩阵表示,效率非常低,而且几乎不是你想要的。我的一个同事曾经使用这种风格继承了一个代码。使用适当的索引调整函数将其转换为简单vector<double>
会使性能提高 30 。抵制诱惑。
答案 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
Y
个X
个副本并将其存储到X中。所以从根本上说,X
仍然是一维对象,只是在std::vector
的每个索引处,您都会获得另一个Y
,std::vector<std::vector<double> >Xtrans(Y,ctr)
的副本。
因此,您的后续语法std::vector
与类型{{1}}的任何构造函数都不匹配。您不像在NumPy或Matlab中那样构建二维数组。
您也可以查看this link。对你来说最好的事情就是编写自己的转置函数,手动将条目放入循环中的新数组中。