我已经通读了很多documentation,但是如果您发现某些我错过了可以解释我的问题的信息,我会很高兴。对于背景,我正在使用3.2.7 Eigen库在Visual Studio 2015中的x86 Windows 10上进行编译。 3.2.7版本是从5月份开始的,虽然从那时起已经有发布,但我还没有看到changelog中的任何内容,这表明我的问题已得到解决。特征库中的大块系数方式乘法失败C++
该问题似乎只出现在特定大小以上的矩阵上。我不知道这是否是我的系统特有的某些副产品或Eigen固有的东西。
以下代码在调试和发布模式下都会产生访问冲突。
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乘以254的mx2尺寸会产生问题,但255乘以254的尺寸不会。如果我增加列大小,我也可以得到访问冲突,所以问题可能与条目总数有关。即使mx1和mx2填充了值,也会出现问题,填充矩阵不必重现问题。
未将topRows()块分配给temp的类似代码不会在发布模式下产生访问冲突。我相信还有更多的东西,因为我最初在代码中发现了这个问题,这个代码是相当复杂的,它只在一定数量的循环之后出现(矩阵大小在循环之间是一致的)。在我的代码中有太多的事情,我无法隔离访问冲突仅在一定数量的循环之后出现的条件。
我很好奇,想知道什么是
1)我在一些明显错误的方式使用本征?
2)你能重现这个问题吗? (你的环境细节是什么?)
3)这是Eigen库中的一个bug吗?
通过将块分配给临时矩阵而不是块可以很容易地解决此问题,即使它效率低下,所以我对此不感兴趣。
看起来像一个错误,假设负1索引是允许的,他们似乎是。如果初始化矩阵,您将看到即使在mx1Rows和cols值较小的情况下,也会将垃圾放入数组mult中。运行'temp.array()。eval()。array()'可以正常工作。您不会在数据之外进行别名。它在x64中执行但不正确。它只是没有错。 – doug