私はdocumentationの多くを読んだことがありますが、私が逃したものが見つかった場合は、私の問題を説明することができます。背景としては、3.2.7固有ライブラリを使用してVisual Studio 2015でx86 Windows 10でコンパイルしています。 3.2.7のバージョンは5月からのもので、その後リリースされている間に私はchangelogに何も見ていないので、私の問題が解決されたことを示しています。大きなブロック係数の乗算がEigenライブラリで失敗するC++
この問題は、特定のサイズを超える行列に対してのみ発生するようです。私はこれが私のシステムに固有の何か、またはアイゲン固有の何かの副産物かどうかはわかりません。
次のコードは、デバッグモードとリリースモードの両方でアクセス違反を生成します。
int mx1Rows = 255, cols = 254;
{//this has an access violation at the assignment of mx2
Eigen::MatrixXd mx1(mx1Rows, cols);
Eigen::MatrixXd mx2(mx1Rows + 1, cols);
Eigen::Block<Eigen::MatrixXd, -1, -1, false> temp = mx2.topRows(mx1Rows);
mx2 = temp.array() * mx1.array();//error
}
私は結果がaliasedする必要がありますので、係数毎の乗算の割り当ては安全であると信じています。
この問題は、mx1Rowsが値254に減少すると、アクセス違反が表示されない場合には面白くなります。それは正しいですが、256 x 254のmx2寸法では問題は発生しますが、寸法は255 x 254ではありません。列のサイズを大きくすると、アクセス違反も発生する可能性があるので、問題はエントリの総数と関係している可能性があります。問題はmx1とmx2が値で満たされていても表示されますが、埋め込まれた行列を持つことで問題を再現する必要はありません。
tempにtopRows()ブロックを割り当てない同様のコードは、リリースモードでアクセス違反を生成しません。もともとこの問題はかなり複雑であり、特定の数のループ(行列のサイズはループ間で一貫していた)の後にのみ現れたので、この問題がこれ以上あると思います。私のコードでは、あまりにも多くのことが起こっているため、特定の回数のループの後にしかアクセス違反が発生しない条件を切り離すことができませんでした。私が知って好奇心何
は
1)私はいくつか明らかに間違った方法で固有値を使用していますか?
2)この問題を再現できますか? (あなたの環境の詳細は?)
3)これはEigenライブラリのバグですか?
この問題を回避するには、ブロックではなく一時ブロックにブロックを割り当てるだけで十分ですが、非効率であってもそのことを知りたいとは思いません。
負の1のインデックスが許されているように見えるバグのように見えます。行列を初期化すると、mx1Rowsとcolの小さな値でも配列multにガベージが置かれていることがわかります。 'temp.array()。eval()。array()'を実行すると問題ありません。あなたはデータの外でエイリアシングしていません。 x64で実行されますが、間違っています。それは間違いではありません。 – doug