2012-04-30 79 views
3

我有以下2D矢量/矩陣X並如下一個矢量Y調換一個2Dvector /矩陣

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

只是爲了讓代碼編譯,你可以聲明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的轉置版本

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類型的任何構造。您不會像在NumPy或Matlab中那樣構建二維數組。您可能還想看看this link。對你來說最好的辦法是編寫自己的轉置函數,手動將條目放入一個循環中的新數組中。

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)這工作得很好 - 因爲你告訴編譯器,你想要創建尺寸爲ctrstd::vector,其值爲Y。 (在你的情況Y是一個空std::vector<double> - 所以你有ctr條目,每個條目是向量空std::vector<double>

所以,簡單地交換ctrY中,你會得到一個換位std::vector希望不是去這裏工作。

而第二個問題是您如何實際轉置值。你實際上需要找出一個算法來完成X的轉置,然後將這些值推送到Xtrans。轉換值與實際構建向量不同。最有可能的是,你的算法就像 - construct XTrans,然後迭代'X and insert values into XTrans`。

+0

感謝您的解釋。爲了構建'XTrans',我首先聲明它是一個2D矢量,並且不傳遞任何參數。由於我想轉置'X',我應該在X上編寫一個迭代器並將值插入到XTrans中。 – user1155299

+0

是的,也許如你所建議的那樣從構造'XTrans'開始 - 將它聲明爲一個空的二維矢量 - 即一個大小爲'ctr'的'std :: vector > - 就像你一樣爲'X'。然後遍歷'X'。但請記住它是二維的,所以你有一個外迭代器,它將遍歷'ctr'成員 - 但是你的成員是std :: vector ,(它們當前是空的 - 你只是聲明瞭'ctr'空'std ::矢量's)所以你將有一個內部迭代器爲你的每個'ctr'' std :: vector 's。 – BeeBand

+0

爲了填充'XTrans',我在迭代'X'之前忘了補充一點,您需要先用某種東西填充'X'(或者可能不是......)如果您使用迭代器,算法會運行, 't做任何事情:-)) – BeeBand

2

除了其他人已經提到的關於修復代碼的內容之外,我想評論一下使用vector<vector<double> >作爲一種非常低效的矩陣表示,它幾乎從來不是你想要的。我的同事曾經使用這種風格繼承了代碼。將其轉換爲簡單的vector<double>並帶有適當的索引擺動功能,可將性能提高,33。抵制誘惑。

您可能想要查看C++的許多可用矩陣庫之一(例如eigenuBlasmtl4等等,還有許多其他的)。