2016-10-10 7 views
0

あなたが行列Aがあるとします。コピーせずに固有行列を平坦化することはできますか?

1 2 
3 4 

2つの扁平あります

1 
2 
3 
4 

1 
3 
2 
4 

がデフォルト(ColMajor)ストレージタイプを使用する場合は、我々が得ることができます後者は

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

これはデータを1回のみコピーします。元を取得するしかし

は、私は考えることができる最善のは、残念ながら、二回

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

インラインvoid flatten(const MatrixXd&src)のマッピング関数 '(row、col) - > vector_ix'(または逆の' vector_ix - >(row、col) 'およびfor-cycle-ingを使用すると、 (MatrixXd&src、VectorXd&dest、inverse_mapper_func&f = line_major_inverse) '(およびdest ixを反復処理する)?有理数を証明するのに使用されるような '三角形'の規則を使用して(http://www.homeschoolmath.net/teaching/rational-numbers-countable.php) –

答えて

0

あなたが代わりに次を使用することができVectorMatrixを使用するために喜んでいる場合は、次のいくつかのケースでは、パフォーマンスヒットを得ることが

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行列を使用します。あなたがMapオブジェクトに名前を付けることができ

0

注:

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

VectorXdなどのv1を使用しています。もちろん、v1を変更するとAも変更されます。 const VectorXd&オブジェクトをコピーせずに受け入れる関数に渡すには、関数テンプレートを作成するか、Ref<const VectorXd>とします。

最初のケースではゼロコピーが必要で、2番目の転置コピーでは1番目のケースが必要です。

関連する問題