2016-07-04 3 views
1

地図関数を使用せずにコンパイル時に固有行列の外層を変更したいと考えています。マップ関数を使用せずに固有行列の外層を変更する方法

私はこれをOuterStrideAtCompileTime変数を使って変更しようとしましたが、動作しません。それを行う方法はありますか?

マットを印刷するもう1つの方法は、毎回入力行列の行数を与えます。固有行列のOuterStrideを印刷する方法は?

ありがとうございます。


は、私はそれが動作していない

mat.OuterStrideAtCompileTime = 7; 

を使用することにより、外側ストライドを変更しようとした時はいつでもそれは、正常に動作しています

MatrixXf mat; 
float arr[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
mat = Map<Matrix<float,Dynamic,Dynamic,Eigen::RowMajor>, 0, OuterStride<Dynamic> > (arr,4,4,OuterStride<Dynamic>(5)); 

のようなマップ機能を持つ固有行列を定義しました。

+1

なぜ変更しますか?あなたはそれをどのように変更するかについていくつかのコードを表示できますか? – kangshiyin

+0

私は、異なるストライドのマトリックスで作業したいです。 – Martin

+0

あなたはより具体的になることができますか?私はそれを変更する必要がある共通の行列演算があるとは想像もできません。 – kangshiyin

答えて

0

外側のストライドは、データ格納に関連するパラメータです。より一般的に使用される名前は、主要な次元です。あなたはここでいくつかの説明を見つけることができます。既存のマトリックスのための基本的

http://www.ibm.com/support/knowledgecenter/SSFHY8_5.3.0/com.ibm.cluster.essl.v5r3.essl100.doc/am5gr_leaddi.htm

、それを変更することはできません。行列の要素を変更せずに変更する唯一の方法は、異なる外側のストライド設定を使用して新しいメモリ空間に行列をコピーすることです。これは通常、行列を別の行列にサブ行列としてコピーするときに発生します。

列の主な行列の場合、可能な最小の外側のストライドは、印刷した数と同じ行数になります。

Eigenを使用している場合、Eigenは通常、あなたがEigen::Mapを期待しているので気にする必要はありません。


実際にはコードは機能しません。 arrに格納されている既存の行列(4x4)がストライド4でstride 5 x 4 columns = 20 > 16であるため、ストライドを5に設定することはすでに範囲外です。

#include <iostream> 
#include <Eigen/Eigen> 

int main(void) { 
    using namespace Eigen; 
    MatrixXf mat; 
    float arr[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; 

    mat = Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, 
     OuterStride<Dynamic> >(arr, 4, 4, OuterStride<Dynamic>(5)); 
    std::cout << "mat with stride 5:\n" << mat << std::endl; 

    mat = Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, 
     OuterStride<Dynamic> >(arr, 4, 4, OuterStride<Dynamic>(4)); 
    std::cout << "mat with stride 4:\n" << mat << std::endl; 

    return 0; 
} 

出力を比較してください。

mat with stride 5: 
      1   2   3   4 
      6   7   8   9 
     11   12   13   14 
     16   0   0 5.01639e-14 
mat with stride 4: 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

あなたは20個の要素

#include <iostream> 
#include <Eigen/Eigen> 

int main(void) { 
    using namespace Eigen; 
    MatrixXf mat; 
    float arr[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; 

    Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, OuterStride<Dynamic> > map1(arr, 4, 4, OuterStride<Dynamic>(5)); 
    mat = map1; 
    std::cout << "map1 outer stride: " << map1.outerStride() << std::endl << map1 << std::endl; 
    std::cout << "mat outer stride: " << mat.outerStride() << std::endl << mat << std::endl; 

    Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, OuterStride<Dynamic> > map2(arr, 4, 4, OuterStride<Dynamic>(4)); 
    mat = map2; 
    std::cout << "map2 outer stride: " << map2.outerStride() << std::endl << map2 << std::endl; 
    std::cout << "mat outer stride: " << mat.outerStride() << std::endl << mat << std::endl; 

    return 0; 
} 

に配列を延長した場合、出力はmatmap1をコピーするときにも、外ストライドの変化を見ることができました

map1 outer stride: 5 
1 2 3 4 
6 7 8 9 
11 12 13 14 
16 17 18 19 
mat outer stride: 4 
1 2 3 4 
6 7 8 9 
11 12 13 14 
16 17 18 19 
map2 outer stride: 4 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
mat outer stride: 4 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

になります。 これはストライドが何であるかをよりよく理解できるようにしたいと考えています。

実際に元のコードでは、Mapを間違った方法で使用しています。Map()からMatrix matにコピーしてはいけません。 そのため、matのストライドを印刷すると、常に4になります。 不要なデータコピーを削除し、ストライドmap1/map2を印刷するだけです。

+0

マトリックスの外板を印刷するには? – Martin

+0

@Madhuあなたの質問で 'mat.outerStride();' – kangshiyin

+0

mat.outerStride()を印刷するたびに、入力順列に関係なく、入力行列の行数が返されます。 – Martin

関連する問題