Eigen的编译错误:if语句中的本征矩阵大小不匹配

时间:2019-05-08 12:11:07

标签: compiler-errors g++ eigen3

我正在处理特征值和静态矩阵大小。我有一个尺寸为(NC-1)* USIZE x(NC-1)* USIZE的矩阵lp。如果NC为1,则会出现编译错误。代码中有问题的部分如下:

if (NC > 1) {
Eigen::Matrix<float,(NC-1)*USIZE,(NC-1)*USIZE> thelp;
for (unsigned int m=0;m<(NC-1);m++) {
  for(unsigned int n=0;n<=m;n++) {
    thelp.block<USIZE,USIZE>(m*USIZE,n*USIZE) = Eigen::Matrix<float,USIZE,USIZE>::Identity();
  }
}

我得到的错误是在thelp上执行块操作的那一行,并且错误消息如下:

Eigen/src/Core/util/StaticAssert.h:115:9: error: ‘YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES’ is not a member of ‘Eigen::internal::static_assertion<false>’
     if (Eigen::internal::static_assertion<bool(CONDITION)>::MSG) {}

如果在NC = 1时执行该语句,显然会出现此错误,因为那么lp的大小为0x0。有没有一种方法可以公式化我的代码片段,使NC = 1,以便我可以继续使用静态大小的矩阵?还是我可以以某种方式让编译器知道由于if表达式而不会执行该语句?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

似乎我问得太快了。我发现有一个本征函数setIdentity()可以让我做自己想做的事情。我只需要在引起问题的那一行上修改原始代码片段:

之前:

thelp.block<USIZE,USIZE>(m*USIZE,n*USIZE) = Eigen::Matrix<float,USIZE,USIZE>::Identity();

之后:

thelp.block<USIZE,USIZE>(m*USIZE,n*USIZE).setIdentity();

这样,我可以避免在NC等于1时尝试将USIZE x USIZE单位矩阵分配给0x0矩阵的错误。