我想使用特征值将矩阵的一部分复制到矩阵本身的另一部分中。我想确保从别名方面理解后果,以便仅在确实需要时才使用eval()
。
说我有以下内容:
MatrixXd M(4,4);
M << 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;
M.block( some indices ) = M.block( some other indices )
我认为应该考虑3种情况:
这根本不是问题。一个例子是:
M.topLeftCorner(2,2) = M.bottomRightCorner(2,2);
给予我们:
一个例子是:
M.topLeftCorner(2,2) = M.block(1,0,2,2);
在这种情况下,我希望这样的事情发生:
我相信这不会是别名的示例。但是,要获得这种行为,就需要保证从左上角开始依次在两个块中逐行进行依次复制元素。
[在这里,我期望混叠。一个例子是:
M.block(1,0,2,2) = M.topLeftCorner(2,2);
类似于结果:
总结:
但是,对于2.和3.,您可能会或可能不会出现混叠问题,具体取决于Eigen版本,目标体系结构和编译器-本质上这些操作的结果是不确定的。也就是说,您不应该依赖当前的行为。
[如果要具有某些明确的行为(不使用临时对象),则可以手动循环遍历矩阵的非重叠块。代替
M.topLeftCorner(2,2) = M.block(1,0,2,2);
您可以这样写:
for(int c=0; c<2; ++c) M.block(0,c,2,1) = M.block(0,c+1,2,1);
或者更好的是,重新考虑整体算法,以避免在矩阵内部复制重叠的块。有关别名的更多详细信息,请参见此页面:http://eigen.tuxfamily.org/dox-devel/group__TopicAliasing.html