我想將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工作嗎?
非常感謝您提供非常快速的答案。但是,即使沒有自動,它也不起作用。 //結果,行數:5,2 \t VectorXd result3 = Map>(result2);' –
AverageCoder
'Map resultAsCol(result2.data(),result2.size ));' 似乎做我想要的。我接受你的答案,並感謝與常見陷阱的聯繫。忽略了它,這一點很重要,因爲我通常儘可能地嘗試使用C++ 11和C++ 14。 –
AverageCoder
對,我忽略了第二個錯誤。 – ggael