我有这些本征复矩阵:
Eigen::MatrixXcd matrix;
Eigen::VectorXcd rhs;
Eigen::VectorXcd solution;
我可以成功加载值并计算解决方案,但是如果尝试:
rhs = matrix*solution;
我在Eigen文件GeneralProduct.h和CxRealAbs.h中遇到与重载“ + =”运算符和双/复杂转换有关的编译器错误
尝试计算残差的类似问题。
有
帮助??
谢谢
凯文
答案 0 :(得分:0)
根据他们的文档,Eigen检查操作的有效性:
操作有效性 本征检查您执行的操作的有效性。如果可能,它将在编译时检查它们,从而产生编译错误。这些错误消息可能很长很丑,但是Eigen将重要消息写在UPPERCASE_LETTERS_SO_IT_STANDS_OUT中。例如:
Matrix3f m; Vector4f v; v = m*v; // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
当然,在许多情况下,例如,在检查动态大小时,无法在编译时执行检查。然后,本征使用运行时断言。这意味着如果在“调试模式”下运行该程序,则在执行非法操作时该程序将中止并显示一条错误消息,并且如果断言被关闭,它可能会崩溃。
MatrixXf m(3,3); VectorXf v(4); v = m * v; // Run-time assertion failure here: "invalid matrix product"
您的RHS
是一个向量,您正尝试从矩阵和向量积中为其分配一个值或一组值。即使从数学角度来看,您也应该问自己这是否是有效的操作类型。
请考虑M
和N
是矩阵,而A
和B
是向量,这些运算的结果是:
M = AB // Cross product and not a dot product
M = AM, MA, BM, MB // yields a transformed matrix using the original matrix
M = AN, NA, BN, NB // yields a transformed matrix using a supplied matrix
A = AA, AB, BA // cross product and not the dot product
A = AM, MA, AN, NA, BM, MB, BN, NB // yields what?
因此在Eigen进行编译时,它正在检查运算符的有效性,因此,这给您带来编译时错误,即未定义+=
且未提供其中一个的重载版本。它根本不知道如何执行预期的操作。 matrix
和vector
类的基础类型是什么都没关系。这与您试图执行的运算符未在某处定义的事实有关。
修改
这里是描述矩阵和向量乘法的链接。直观上,我们假定这会产生一个向量,但是对此有一个隐含的理解,但是从矩阵的角度来看,该向量可以是行或列,以便返回的向量可以是1xM
或{{1} }矩阵。
这里是显示不同解释的链接,即使它们将返回相同的结果:可以在文档的Mx1
部分找到:Maxtrix-Vector Product
尽管两种不同的解释提供的最终结果相同,但它们的操作次数却有所不同。如果没有明确说明应该是行还是列乘积,则可能导致某种类型的歧义。我不知道Eigen如何确定将使用哪种方法,我假设它将选择操作最少,计算量最少的方法。
这不是您遇到的主要问题。最终,编译器仍会生成一条错误消息,指出未定义重载的运算符。我不知道这在您的代码中来自哪里。因此,当尝试在其3.2.3
类型的版本上执行操作时,这可能在它们的库中。如果无法运行和编译完整的源代码,那么我将无法轻松确定究竟是什么在生成此编译器错误,并且我也不知道您使用的是哪个编译器在生成您的错误。
答案 1 :(得分:0)
问题出在我身上。我已经将* operator for std :: complex * real重载了,因为某些较早的std版本不完整。列出的第一个错误是发生在Eigen身上,这使我误入歧途。
GeneralProduct.h(287):没有可行的重载'+ ='
CxRealAbs.h(111):无法将'const Eigen :: Map,-1,1,0,-1,1>,1,Eigen :: Stride <0,0>>'转换为'double'而没有转换
消除我的过载,它可以编译并正常运行。本征动态矩阵没问题。
感谢您的答复。
凯文