2017-03-16 153 views
3

我想將Matlab的代碼帶入C++。有一些與我的案例in the KDE Eigen Forums有關的信息。映射特徵複製矩陣

我儘量做到有關Matlab的meshgrid,爲其解決方案給出了有

X = RowVectorXd::LinSpaced(1,3,3).replicate(5,1); 
Y = VectorXd::LinSpaced(10,14,5).replicate(1,3); 

即其他維度的.replicate向量的數量。在我的情況下,我有兩個現有(NX 1)載體,並希望建立一個(N^2,2),其中包含載體元件的所有組合矩陣,即:

[1 3 6]^T and [7 8]^T ==> [1 7, 3 7, 6 7, 1 8, 3 8, 6 8]^T 

其中^T只是意味着轉置,線用逗號分隔。 (在我的情況下,矢量使用浮動,但這不應該)。

矩陣[1 3 6 1 3 6]^T的第一列很容易通過Eigen的.replicate函數創建。但是,我很難創建第二列[7 7 7 8 8 8]^T

我的想法是在其它維度使用.replicate(獲得基質),然後使用一個橫行Eigen::Map將其帶到線性(矢量)圖(建議in the docs),但據我所知,所產生的編譯器錯誤,使得Eigen::Map不適用於Eigen::Replicate類型。

#include <Eigen/Core> 
using namespace Eigen; 
int main() 
{ 
    MatrixXd reptest1(1, 5); 
    reptest1 << 1, 2, 3, 4, 5; 
    auto result2 = reptest1.replicate(2, 1); // cols, rows: 5, 2 
    auto result3 = Map<Matrix<double, 1, Dynamic, Eigen::RowMajor> >(result2); // this doesn't work 
return 0; 
} 

VS2017抱怨:error C2440: '<function-style-cast>': cannot convert from 'Eigen::Replicate<Derived,-1,-1>' to 'Eigen::Map<Eigen::Matrix<double,1,-1,1,1,-1>,0,Eigen::Stride<0,0>>' GCC還抱怨。 no matching function for call(不能複製&粘貼確切消息,因爲它在另一臺機器上)。

我這樣做太複雜了嗎?應該使用Map工作嗎?

回答

2

Map只能在矩陣上工作,而不能在表達式上工作。所以用MatrixXd result2代替auto result2,就完成了。見common pitfalls

+0

非常感謝您提供非常快速的答案。但是,即使沒有自動,它也不起作用。 //結果,行數:5,2 \t VectorXd result3 = Map >(result2);' – AverageCoder

+0

'Map resultAsCol(result2.data(),result2.size ));' 似乎做我想要的。我接受你的答案,並感謝與常見陷阱的聯繫。忽略了它,這一點很重要,因爲我通常儘可能地嘗試使用C++ 11和C++ 14。 – AverageCoder

+0

對,我忽略了第二個錯誤。 – ggael