2016-10-10 32 views
0

假設你有一個矩陣A是否有可能在不復制的情況下將特徵矩陣變平?

1 2 
3 4 

有兩個削平:

1 
2 
3 
4 

1 
3 
2 
4 

如果使用默認值(ColMajor)存儲類型,我們可以得到後者爲

VectorXd v = Map<const VectorXd>(A.data(), A.size()) 

這隻會複製一次數據。

但要獲得前者,我能想到的最好的是

MatrixXd At = A.transpose() 
VectorXd v = Map<const VectorXd>(At.data(), At.size()) 

這將數據複製兩次,很遺憾。

有點混亂的(至少對我來說)

VectorXd v = Map<const VectorXd>(A.transpose().data(), A.size()) 

編譯,但產生完全相同的結果不具有transpose那裏。

參見:Eigen Convert Matrix to Vector

+1

使用映射函數'(row,col) - > vector_ix'(或逆向vector_ix - >(row,col)'和for-cycle-in inline inline void flatten(const MatrixXd&src ,(VectorXd&dest,direct_mapper_func&f = line_major_direct)'(迭代src行/ col)或'inline void flatten(const MatrixXd&src,VectorXd&dest,inverse_mapper_func&f = line_major_inverse)'(迭代dest ix)使用像'三角'規則[用於證明有理數是可數](http://www.homeschoolmath.net/teaching/rational-numbers-countable.php) –

回答

0

如果你願意使用的Matrix而不是Vector你可以使用以下命令:

Eigen::MatrixXi m(2, 2); 
m << 1, 2, 3, 4; 
std::cout << m << "\n\n"; 

// Option 1 
Eigen::MatrixXi v1; 
v1 = m.transpose(); // Copy #1 
v1.resize(1, 4); // No copy 
std::cout << v1 << "\n\n"; 

// Option 2 
v1 = m; // Copy #1 
v1.resize(1, 4); // No copy 
std::cout << v1 << "\n\n"; 

注意,在某些情況下,你可能會得到一個性能命中時使用1D矩陣。

0

請注意,您可以命名Map對象:

Map<const VectorXd> v1(A.data(), A.size()); 

,並使用v1VectorXd。當然,修改v1也會修改A。 要將它傳遞給接受const VectorXd&對象但沒有副本的函數,可以使用您的函數模板或使其成爲Ref<const VectorXd>

然後第一種情況需要零拷貝,第二種情況需要零拷貝。

相關問題